Unix'找'+'grep'语法与awk

Che*_*eso 3 unix syntax grep find

我正在使用这一行在我所在的目录及其所有子目录中的文件中找到短语"B206".

find . -exec grep -s "B206" '{}' \; -print 
Run Code Online (Sandbox Code Playgroud)

当它试图读取某些文件并实际上将putty中的标题栏更改为一堆奇怪的字符时崩溃

例如,当它遇到位于子目录中的jpg文件时,它一直崩溃.标题栏会更改,并且在屏幕中存在:

ÐF»*rkNQeË+Z׳kU£~MÞçÄZ½ªéúýØâÑn¡[U+Þ4ªÒ9/ê£<ú¯4}[IÓ­îÃ¥K»G%ݳ¢
Run Code Online (Sandbox Code Playgroud)

强制我按Ctrl + C返回提示然后退出.

有什么方法可以在这行中添加代码来排除jpg文件吗?更好的是,我可以在一段代码中添加要排除的扩展名列表吗?


编辑:
- 不& - 我不适合我
我发现这个类似的问题也与我有些相关

Ada*_*eld 8

没有理由使用find:grep带有递归选项,-r.要获取具有匹配项的文件名列表(而不是所有文件中所有匹配行的列表),您可以使用该-l选项.如果要完全忽略所有二进制文件,可以使用--binary-files=without-match选项.如果您只想忽略具有特定扩展名的文件,则可以使用该--exclude选项,例如--exclude=*.{jpg,jpeg}忽略以.jpg或结尾的所有文件.jpeg.因此,你应该能够得到你想要的东西:

grep -r -l --binary-files=without-match .
Run Code Online (Sandbox Code Playgroud)

现在,您在一条评论中提到您的版本grep没有-r-l选项.这是不幸的,我建议得到一个更新版本grep(最好是GNU品种).

还有一点需要注意:如果使用find -exec,则应使用a +来结束命令而不是分号,例如:

find . -exec grep options '{}' '+'
Run Code Online (Sandbox Code Playgroud)

通过使用a +,find将只分离单个进程并将所有匹配的文件名作为命令行参数传递给一个实例grep.只要你没有一百万个匹配文件(这会创建一个远远超过shell可以处理的命令行),这将会快得多.如果使用分号,find则为每个匹配文件分配一个新进程,这对于大量文件来说非常慢.