我有一个目录和更多子目录,如下所示 -
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