4

我使用这一行在我所在目录及其所有子目录的文件中查找短语“B206”。

find . -exec grep -s "B206" '{}' \; -print 

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

例如,当它遇到子目录中的 jpg 文件时,它总是崩溃。标题栏发生变化,画面中出现:

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

强迫我 Ctrl+C 回到提示符,然后退出。

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


编辑:
-not & -我不为我工作
我发现这个类似的问题也与我的有点相关

4

12 回答 12

8

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

grep -r -l --binary-files=without-match .

现在,您在其中一条评论中提到您的版本grep没有-ror-l选项。不幸的是,我建议获得更新版本的grep(最好是 GNU 版本)。

进一步说明:如果使用find -exec,则应使用 a+结束命令而不是分号,例如:

find . -exec grep options '{}' '+'

通过使用+,find只会派生一个进程并将所有匹配的文件名作为命令行参数传递给grep. 只要您没有一百万个匹配文件(这将创建一个比 shell 可以处理的命令行要长得多的命令行),这将会快得多。如果您改用分号,find则为每个匹配的文件派生一个新进程,这对于大量文件来说确实很慢。

于 2009-06-22T16:08:21.170 回答
4

如果你的环境不能做任何花哨的 grep,也许你的 awk 可以做到:

find . | awk '!/((\.jpeg)|(\.jpg)|(\.png))$/ {print $0;}' | xargs grep "B206"
于 2009-06-22T16:54:46.307 回答
3

只是引用,不需要关闭终端,可以使用命令reset恢复终端输出模式。

您还可以执行先前的 grep 以删除您不想要的扩展:

find -print | grep -v '\(\.jpg\|\.bmp\)$' | xargs grep "B206"
于 2009-06-22T16:36:36.123 回答
3

您可以使用 grep 的-I开关:

Process  a  binary  file as if it did not contain matching data;
this is equivalent to the --binary-files=without-match option.

简而言之,grep 将简单地假设文件不匹配,这将阻止输出二进制数据。

于 2009-06-22T15:51:06.500 回答
2

鉴于最近关于ack的爱情盛宴,我很惊讶还没有人提到它。

您可以按扩展名配置类型,以便您只“grep”您想要的文件。或者,鉴于您一直面临的问题,您也可以使用--nobinary 。

于 2009-06-22T17:07:26.883 回答
2

我尝试了 Erik 的命令,但我收到关于 no -grep 谓词的错误。也许我的 find 版本太旧了。

这对我有用:

find . -type f -a -not -name \*.jpg -exec grep "B206" {} \;
于 2009-06-22T15:58:35.660 回答
2
寻找 。-type f -a -not -name \*.jpg -exec grep -li "string" "{}" \;

此示例来自 Mac OSX 10.5,您需要检查您的环境的 find 手册页,因为 GNU find 和其他供应商实现之间存在一些差异。检查 Solaris(只是为了好玩,从未指定目标操作系统):

寻找 。-类型 f -a !-name \*.jpg -exec grep -li "string" "{}" \;

此构造查找名称不以 .jpg 结尾的所有文件,并为每个文件执行 grep。

根据您的外壳,您可能需要转义爆炸(!)才能使其像宣传的那样工作。

于 2009-06-22T15:47:30.060 回答
1
grep -r --exclude=*.jpg B206 .

对不起,来自另一条评论:

只有 GNU grep 带有 -r (递归),真正的 UNIX grep 没有。您必须安装 GNU grep 或将其与 find 一起使用。– 终点站

于 2009-06-22T16:13:26.040 回答
1

要将 grep 与 find 一起使用,我的语法是:

find . -name "*" -print | xargs grep B206

过滤文件的所有选项,二进制文件和所有文件,然后将结果作为参数传递给 grep 命令。

于 2009-06-22T16:15:20.550 回答
1

我认为问题在于当您 grep 二进制文件时,它会输出二进制数据。该二进制数据以某种方式在您的 shell 中被解释。

我建议尝试使用命令“strings”来确保您的输出首先是纯文本,然后在“strings”的输出上使用 grep。

于 2009-06-22T16:19:38.257 回答
1

如果您可以访问 gfind,只需在表达式中添加“-not -name '*.jpg'”。

gfind . -not -name '*.jpg' -exec grep -s "B206" '{}' \; -print

另一个选项(此任务不需要,但一个有用的技巧)是,如果你想使用真正花哨的正则表达式,做

查找some_easy_high_level_filter_expression-ls | perl -pe '{ / your_Perl_RegExp_of_choice / }' > ./files_to_search_in

grep选项'cat ./files_to_search_in'

#前一行应该有反引号,但我无法让格式化程序转义它们

这提供了缓存文件列表的有时需要的好处,以防您想要更改 grep 表达式以对其进行微调或仅执行 1 个以上的 grep。

于 2009-06-22T15:53:25.223 回答
0

grep -I -r "字符串" *

于 2009-06-22T15:55:34.413 回答