5

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

我使用以下命令

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 文件或日志文件或其他类型的文件)?

4

3 回答 3

11

我认为您正在尝试在该管道findgrep后半部分使用;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$'
于 2013-08-26T15:10:12.987 回答
1
find . | grep -v "jar$" | grep -v "log$" | grep -v "gz$"
于 2013-08-26T15:09:32.307 回答
0

错误

find: grep terminated by signal 13

是由于 find 不会接受来自管道的输入。将-name第二个 find 的参数放在第一个 find 中。同样使用-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
于 2013-08-26T15:17:45.853 回答