![Xargs 将输入传递给包含管道的命令](https://linux22.com/image/1503776/Xargs%20%E5%B0%86%E8%BE%93%E5%85%A5%E4%BC%A0%E9%80%92%E7%BB%99%E5%8C%85%E5%90%AB%E7%AE%A1%E9%81%93%E7%9A%84%E5%91%BD%E4%BB%A4.png)
为了了解如何使用管道操纵绑定优先级,我尝试针对每个目录打印一个文件的路径 - 每个目录:
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 不同。