如何在find中使用-exec中的管道

时间:2014-02-17 09:36:27

标签: unix find exec pipe

有没有办法在find中的-exec中使用管道?我不希望grep遍历整个文件,只能通过每个文件的第一行。

find /path/to/dir -type f -print -exec grep yourstring {} \;

我试图用“cat”和“head -1”把管道放在那里,但是效果不好。我尝试以某种方式使用括号,但我没有设法弄清楚如何将它们放在那里。 我非常感谢你的帮助。我知道如何在不使用find的情况下以其他方式解决问题,但是我们尝试在学校使用find和pipeline来实现它,但是无法管理如何操作。

find /path/to/dir -type f -print -exec cat {} | head -1 | grep yourstring \;

这是我们如何尝试这样做,但无法管理括号,甚至可能。我试图通过网络查看,但找不到任何答案。

2 个答案:

答案 0 :(得分:40)

为了能够使用管道,您需要执行 shell 命令,即带有管道的命令必须是-exec的单个命令。

find /path/to/dir -type f -print -exec sh -c "cat {} | head -1 | grep yourstring" \;

请注意,以上是 Catless Use of Cat ,可以写成:

find /path/to/dir -type f -print -exec sh -c "head -1 {} | grep yourstring" \;

实现目标的另一种方法是:

find /path/to/dir -type f -print -exec awk 'NR==1 && /yourstring/' {} \;

答案 1 :(得分:2)

这并没有直接回答你的问题,但是如果你想做一些复杂的操作,你可能会更好地编写脚本:

for file in $(find /path/to/dir -type f); do echo ${file}; cat $file | head -1 | grep yourstring; done