Xargs 将输入传递给包含管道的命令

Xargs 将输入传递给包含管道的命令

为了了解如何使用管道操纵绑定优先级,我尝试针对每个目录打印一个文件的路径 - 每个目录:

find $PWD -type d | xargs --delimiter "\n" -I% -n 1 (find % -maxdepth 1 | head -1)

我得到了no matches found: (find % -maxdepth 1 | head -1)。如果没有括号,我会得到 ,xargs: find: terminated by signal 13所以我很确定我们需要以某种方式使管道右关联。

如何将 xargs 输入传递给包含管道的命令?(请不要告诉我使用-exec,我想学习如何操纵其他问题的绑定优先级)。

答案1

使用 xargs 即可:

find . -type d|xargs -I % sh -c 'find % -type f -maxdepth 1 | head -1'

但请记住:内部循环是很多快点!

time find $PWD -type d | while read dir;do find $dir -type f -maxdepth 1 | head -1;done >/dev/null                                                                                       
    0m09.62s real     0m01.67s user     0m02.36s system
time find . -type d|xargs -I % sh -c 'find % -type f -maxdepth 1 | head -1' >/dev/null                                                                                                   
    0m12.85s real     0m01.84s user     0m02.86s system

答案2

我个人不喜欢 xargs

find $PWD -type d | while read dir;do find $dir -type f -maxdepth 1 | head -1;done

答案3

这是最快的解决方案,一切都是内部的:

time find . -type d | while read dir;do for file in "$dir"/*;do if [ -f "$file" ]; then realpath $file;break;fi;done;done >/dev/null
    0m00.21s real     0m00.08s user     0m00.10s system

shell 中无与伦比的速度。(我说过我不喜欢 xargs)

答案4

我知道这是一篇老帖子,但下面介绍了如何使用 bash -c 使用子 shell

find $PWD -type d | xargs --delimiter "\n" -I% -n 1 bash -c 'find % -maxdepth 1 | head -1'

让我解释一下:bash -c 生成一个子 shell,它接受一个字符串参数,在本例中是 find 命令。作为子 shell,您可以使用任何您喜欢的命令,只要您记住该命令在字符串内,并且子 shell 的环境可能与父 shell 不同。

相关内容