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.txtandromeda.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 执行;但可以从外壳

Unix(AIX) set命令

在 find 命令中查找不支持 printf 的 AIX 系统上的前 N ​​个最旧文件

AIX硬件管理常用命令

Unix Study之--AIX系统监控工具tops

AIX 版本 6.1 中的查找命令