使用带有find命令的管道

时间:2012-02-15 17:50:50

标签: bash awk find

我有一系列分隔文件,其中一些文件有一些不良数据,可以通过对它们进行列计数来识别。我可以使用以下命令找到它们:

find ./ -name 201201*gz -mtime 12

它们都是gzip压缩的,我不想将它们全部解压缩。所以为了检查我一直在做的列计数我在每个文件上运行它作为第二个命令:

zcat ./path/to/file.data | awk '{print NF}' | head

我知道我可以通过查找-exec在每个文件上运行命令,但是我怎样才能让它通过管道运行?我尝试了几件事,我都没想过会这样做,也没有做过:

find ./ -name 201201*gz -mtime 12 -print -exec zcat {} \; | awk '{print NF}'| head
find ./ -name 201201*gz -mtime 12 -print -exec "zcat {} | awk '{print NF}'| head" \;

2 个答案:

答案 0 :(得分:3)

我会使用显式循环方法:

find . -name 201201*gz -mtime 12 | while read file; do
    echo "$file: "
    zcat "$file" | awk '{print NF}' | head
done

答案 1 :(得分:2)

或多或少你通过查找管道:

find . -name "foo" -print0 | xargs -0 echo

所以你的命令看起来像是:

find ./ -name "201201*gz" -mtime 12 -print0 | xargs -0 zcat | awk '{print NF}'| head

-print0xargs -0只是有助于确保包含特殊字符的文件不会破坏管道。