我想在文件目录中查找特定模式,并希望在显示结果时排除某些模式。
我使用以下命令
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文件或日志文件或结果集中的其他类型的文件)?
答案 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