为什么带有管道的xargs命令仅对单个文件有效,而对多个文件无效?

时间:2018-08-29 13:53:08

标签: bash pipe

我试图连续发送一些命令;它只能使用一个文件,但是一旦我同时尝试多个文件,就会给我一个错误。

在我的工作文件夹中的单个文件上:

find . -type f -iname "summary.5runs.*" -print0 | xargs -0 cut -f1-2 | head -n 2
#It works

现在,我要扫描工作文件夹所有子目录中名称中带有特定前缀/后缀的所有文件,然后将结果写入文本文件

find . -type f -iname "ww.*.out.txt" -print0 | xargs -0 cut -f3-5 | head -n 42 > summary.5runs.txt
#Error: xargs: cut: terminated by signal 13

我想我的问题是要反复浏览多个文件,但是我不确定该怎么做。

1 个答案:

答案 0 :(得分:1)

最后的head在总输出42行之后停止,但是您希望每个文件都可以使用它。您可以使用xargs中的一个子外壳来轻描淡写:

xargs -0 -I{} bash -c 'cut -f3-5 "$1" | head -n 42' _ {} > summary.5runs.txt

或者您可以将其作为-exec动作的一部分:

find . -type f -iname "ww.*.out.txt" \
    -exec bash -c 'cut -f3-5 "$1" | head -n 42' _ {} \; > summary.5runs.txt

或者,您可以循环遍历子shell中的所有文件,因此只需要生成一个即可:

find . -type f -iname "ww.*.out.txt" \
    -exec bash -c 'for f; do cut -f3-5 "$f" | head -n 42; done' _ {} + \
    > summary.5runs.txt

通知{} +而不是{} \;