Unix的 '发现' + 'grep的' 语法与AWK(Unix &

2019-09-16 16:39发布

我用这条线找到我的目录中的短语,“B206”文件中及其所有子目录中。

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

它崩溃时,它尝试读取某些文件,实际上改变腻子标题栏一堆奇怪的字符

例如,它崩溃时,命中一个jpg文件,该文件是在一个子目录中的所有时间。 标题栏的变化,并在屏幕上,存在:

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

迫使我按Ctrl + C出来回的提示,然后退出了。

任何方式将代码添加到该行,将排除JPG文件? 更妙的是,一段代码,我可以添加扩展名的列表中排除?


编辑:
- 不是& - 我不为我工作
我发现这个类似的问题也有所涉及矿山

Answer 1:

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

find . | awk '!/((\.jpeg)|(\.jpg)|(\.png))$/ {print $0;}' | xargs grep "B206"


Answer 2:

没有理由使用findgrep配备了一个递归选项, -r 。 以刚刚得到的文件名的匹配项列表(如图中的所有文件与所有的匹配行的列表),你可以使用-l选项。 如果你想彻底忽略所有二进制文件,你可以使用--binary-files=without-match选项。 如果你只是想忽略具有一定的扩展名的文件,可以使用--exclude选项,如--exclude=*.{jpg,jpeg}忽略结尾的文件.jpg.jpeg 。 因此,你应该能够得到你想要的这个东西:

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

现在,你在你的意见,你的版本一个提到grep没有-r-l选项。 这是不幸的,我建议得到一个较新版本grep (最好是GNU品种)。

一个进一步注:如果您使用find -exec ,你应该使用一个+结束命令,而不是semicoln,例如:

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

通过使用+find将只叉关闭单个工艺和所有的匹配的文件名作为命令行参数的传递到的一个实例grep 。 只要你没有一百万匹配的文件(这将远远长于外壳可以处理创建一个命令行),这将是非常非常快。 如果你使用一个分号来代替, find每个匹配的文件,这是一个很大的数字文件很慢的一个新的进程。



Answer 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的将简单地假定文件不匹配,这将保证被输出二进制数据。



Answer 4:

只是一个报价,你不需要关闭终端,你可以使用命令reset恢复端子输出模式。

你也可以做一个以前grep来删除不想要的扩展:

find -print | grep -v '\(\.jpg\|\.bmp\)$' | xargs grep "B206"


Answer 5:

我试图Erik的命令,但我得到一个错误约没有-grep谓语。 也许我找到的版本太旧。

这为我工作:

find . -type f -a -not -name \*.jpg -exec grep "B206" {} \;


Answer 6:

find . -type f -a -not -name \*.jpg -exec grep -li "string" "{}" \;

这个例子来自的Mac OSX 10.5,则需要检查发现男子页为您的环境,因为有GNU之间存在一些分歧发现和其他厂商的实现。 检查的Solaris(只是为了好玩,从未指定的目标OS):

find . -type f -a ! -name \*.jpg -exec grep -li "string" "{}" \;

这种结构发现,其名称不以.jpg结束,高层用grep为他们每个人的所有文件。

根据您的外壳,你可能需要逃避感叹号(!)为了​​让这项工作作为标榜。



Answer 7:

鉴于在最近lovefest ACK ,我很惊讶,没有人提到它。

让你用grep'你想要的文件,您可以通过扩展配置类型。 或者你也可以只使用--nobinary,因为你一直面临的问题。



Answer 8:

如果你有机会到gfind,只需添加“ - 不是-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的选项 “猫./files_to_search_in”

前行应该有反引号,但我不能让格式化逃脱他们

这使缓存的情况下,要grep的表达改变鳍调整或只是做超过1个grep的文件列表中有时需要的利益。



Answer 9:

grep -r --exclude=*.jpg B206 .

对不起,从另一个评论:

只有GNU的grep带有-r(递归),真正的UNIX的grep没有。 您必须安装GNU的grep或查找使用。 - 总站



Answer 10:

我认为这个问题是当你用grep二进制文件,它输出二进制数据。 二进制数据以某种方式被解释在你的shell。

我建议尽量使用可确保您的输出是纯文本的第一个命令“串”,然后在输出用grep“弦”。



Answer 11:

若要查找使用grep,我的语法是:

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

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



Answer 12:

grep的-i -r “字符串” *



文章来源: Unix 'find' + 'grep' syntax vs. awk