从find命令的结果中过滤文件

时间:2013-08-26 15:02:03

标签: unix

我想在文件目录中查找特定模式,并希望在显示结果时排除某些模式。

我使用以下命令

find . -type f -exec grep -il 'foo' {} \; | find . -not -name "*.jar" -not -name "*.gz" -not -name "*.log" 2>/dev/null

显示结果时,我看到以下错误消息

find: grep terminated by signal 13

有人可以指导我为什么会出现此错误消息,以及是否有更好的命令用于获取所需结果(基本上不包括jar文件或日志文件或结果集中的其他类型的文件)?

3 个答案:

答案 0 :(得分:4)

我认为您在该管道的后半部分尝试将find用作grep; find不起作用。你应该做的是在一个命令中使用它:

find . -type f -not -name "*.jar" -not -name "*.gz" -not -name "*.log" -exec grep -il 'foo' + 2>/dev/null

find . -type f -not -name "*.jar" -not -name "*.gz" -not -name "*.log" -exec grep -qi 'foo' \; -print 2>/dev/null

或者让grep遍历树本身并在之后过滤名称(使用grep,而不是find):

grep -irl foo . | grep -v -e '\.jar$' -e '\.gz$' -e '\.log$'

答案 1 :(得分:1)

find . | grep -v "jar$" | grep -v "log$" | grep -v "gz$"

答案 2 :(得分:0)

错误

find: grep terminated by signal 13

是由于find不接受来自管道的输入这一事实引起的。将第二个查找中的-name参数放在第一个中。同样使用-exec参数来查找几乎总是错误的事情;它为每个grep生成一个新进程。这是使用xargs代替的好地方:

find . -type f -not -name "*.jar" -not -name "*.gz" -not -name "*.log" -print0 2> /dev/null | xargs -0 grep -il 'foo' 2> /dev/null