文件名带有空格,通过管道传输到两个 xargs 命令

文件名带有空格,通过管道传输到两个 xargs 命令

我有一个目录和更多子目录,如下所示 -

file with spaces.txt
filewithsuperlonglines.txt
ordinaryfile.txt
binaryfile.bin

命令 -

查找 . -type f -print0 | xargs -0 文件 | grep 文本 | grep -v long | cut -d: -f1

生成正确的文件列表(即不包含很长行的文本文件)

./file with spaces.txt
./ordinaryfile.txt

但是当我在命令末尾添加另一个 xargs 时,出现错误 -

查找 . -type f -print0 | xargs -0 文件 | grep 文本 | grep -v long | cut -d: -f1 | xargs -0 awk -f someprocessing.awk

gawk: someprocessing.awk:3: fatal: cannot open file `./file' for reading (No such file or directory)

someprocessing.awk 的内容并不相关,因为如果我使用该cat命令,我会收到同样的错误。

如何获取最后一个管道后的命令来处理名称中带有空格的文件?

答案1

find -print0生产输出使用空字符作为分隔符。 xargs -0需要输入使用空字符作为分隔符。第一个xargs命令从 中获取空字符find;第二个命令则改为使用换行符。

尝试这个:

find . -type f -print0 | \
    xargs -0 file | \
    grep text | \
    grep -v long | \
    cut -d: -f1 | \
    tr '\n' '\0' | \
    xargs -0 awk -f someprocessing.awk

(这应该适用于 GNU Coreutils 版本tr;我不确定其他tr实现是否有效。)

答案2

如果文件名包含 ':',则接受的解决方案将失败。仅当文件名包含 ': ' 并避免 \0 操作时,以下操作才会失败:

find . -type f | parallel file | grep text | grep -v long |\
parallel --colsep ': ' awk -f someprocessing.awk {1}

它使用 GNU Parallel,因此您可以免费并行完成 awk。

观看介绍视频以了解更多信息:http://www.youtube.com/watch?v=OpaiGYxkSuQ

相关内容