如何将 find 的输出通过管道传输到另一个 find 调用

如何将 find 的输出通过管道传输到另一个 find 调用

这就是我想做的

find . -maxdepth 1 -type d -print0 | xargs -0 -P4 find -name 'war' -type d

我想创建一个以 null 结尾的目录名称列表,然后将此列表传递给 xargs,xargs 对于每个目录名称调用 find 使用 4 个进程池。

我的问题是:如何在管道查找命令中访问标准输入?就像是

find <STDIN> -name 'war' -type d

答案1

Find 无法从标准输入读取其路径,您无法-像许多其他程序一样指定。

我建议您使用 GNU Parallel 来并行运行:

find . -mindepth 1 -maxdepth 1 -type d -print0  | parallel -0 --jobs 4 \
    find {} -name "war" -type d

请注意添加-mindepth 1到第一个查找中。如果不包含该内容,当前目录 ( .) 也将传递到其中一个查找结果中,并且您将获得双重结果。

$ mkdir a b c d e
$ mkdir b/war c/war
$ find . -mindepth 1 -maxdepth 1 -type d -print0  | parallel -0 --jobs 4 \
    find {} -name "war" -type d
./b/war
./c/war
$ find . -maxdepth 1 -type d -print0  | parallel -0 --jobs 4 \
    find {} -name "war" -type d
./c/war
./b/war
./c/war
./b/war

答案2

用这个:

find . -maxdepth 1 -type d -print0 |
xargs -0 -I {} -P4 find "{}" -name "war" -type d

更好的方法是排除.路径:

find . -maxdepth 1 -not -path .  -type d -print0 |
xargs -0 -I "{}"  find "{}" -name "war" -type d

相关内容