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

use*_*737 4 unix

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

我使用以下命令

find . -type f -exec grep -il 'foo' {} \; | find . -not -name "*.jar" -not -name "*.gz" -not -name "*.log" 2>/dev/null
Run Code Online (Sandbox Code Playgroud)

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

find: grep terminated by signal 13
Run Code Online (Sandbox Code Playgroud)

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

Kev*_*vin 10

我想你想使用find作为grep该管道的下半年; find不是那样工作的。您应该做的是在一个命令中完成所有操作:

find . -type f -not -name "*.jar" -not -name "*.gz" -not -name "*.log" -exec grep -il 'foo' {} + 2>/dev/null
Run Code Online (Sandbox Code Playgroud)

或者

find . -type f -not -name "*.jar" -not -name "*.gz" -not -name "*.log" -exec grep -qi 'foo' {} \; -print 2>/dev/null
Run Code Online (Sandbox Code Playgroud)

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

grep -irl foo . | grep -v -e '\.jar$' -e '\.gz$' -e '\.log$'
Run Code Online (Sandbox Code Playgroud)