AIX Unix find 命令获取第一个元素然后移动到下一个元素
Posted
技术标签:
【中文标题】AIX Unix find 命令获取第一个元素然后移动到下一个元素【英文标题】:AIX Unix find command to get first element then move on to the next 【发布时间】:2016-11-03 06:03:30 【问题描述】:我的list.txt
文件有几百个条目指向位于/tmp
分区上的文件名。我正在收集以“a”开头的文件,例如apples.txt
、andromeda.txt
等,以将它们复制到目录中。
但是,我不想复制 所有 文件,而只想复制找到的 第一个 文件。它不必排序;只是第一个。
我该怎么做?欢迎任何提示。
#!/bin/bash
for i in `/usr/bin/cat /tmp/list.txt`
do
find /tmp/$i -name a* -exec cp /tmp/found_first_file_start_with_a \;
done
【问题讨论】:
你失去了我。如果/tmp/list.txt
包含文件 名称,为什么要使用find
(它将目录作为位置参数)?
您不只是在文件 (list.txt
) 中搜索名称的最后一个组件以 a
开头的第一行吗?使用find
似乎很浪费,除非在您制作副本之前可能已经删除了一些名称(如果这是您的问题的一部分,有一些方法可以解决)。也许sed -n '\%/a[^/]*$%p;q;' /tmp/list.txt
?
接受的答案与我对您问题的解释不符:for all subdirectories of /tmp given in /tmp/list.txt copy a file starting with the letter a to another directory
。您能否编辑您的问题,以便其他人了解您想要什么以及您使用 list.txt 的原因?
【参考方案1】:
忘记find
,试试这个:
set -- /tmp/a*
test -z "$1" || cp "$1" /tmp/found_first_file_start_with_a
【讨论】:
有些文件可能在/tmp
下的子目录中,而/tmp
中可能没有直接以a
开头的文件,所以你的glob可能不会映射到现有文件(在 Bash 中,您需要设置 shopt -s nullglob
以获取任何内容,而不是生成名称 /tmp/a*
。【参考方案2】:
您可以使用-quit
命令到find
让它在第一个之后停止:
find /tmp -name a* -exec cp /tmp/found_first_file_start_with_a \; -quit
但是,只有当 exec 返回 true 时才会退出。如果 cp 命令失败(无论出于何种原因),它将继续搜索更多文件。因此,您可以只打印第一个文件并将其捕获以用于单独的cp
命令:
file=$(find /tmp -name a* -print -quit)
cp $file /tmp/found_first_file_start_with_a
【讨论】:
find
的 AIX 7.2 手册似乎没有列出 -quit
— 尽管它的功能与 GNU find
相当接近。以上是关于AIX Unix find 命令获取第一个元素然后移动到下一个元素的主要内容,如果未能解决你的问题,请参考以下文章
aix unix 6.1 - 'find' 命令未通过 cronjob 执行;但可以从外壳