我在目录树中寻找字符串foo=在文本文件中。在一个普通的Linux机器上,我有bash shell:

grep -ircl "foo=" *

目录中还有许多匹配“foo=”的二进制文件。由于这些结果不相关并降低了搜索速度,所以我希望grep跳过搜索这些文件(主要是JPEG和PNG图像)。我该怎么做呢?

我知道有——exclude=PATTERN和——include=PATTERN选项,但模式格式是什么?grep的手册页说:

--include=PATTERN     Recurse in directories only searching file matching PATTERN.
--exclude=PATTERN     Recurse in directories skip file matching PATTERN.

搜索grep包括,grep包括排除,grep排除和变体没有找到任何相关的

如果有更好的方法只在某些文件中进行grepping,我完全赞成;移动有问题的文件是行不通的。我不能只搜索某些目录(目录结构很混乱,到处都是东西)。此外,我不能安装任何东西,所以我必须使用常用工具(如grep或建议的find)。


当前回答

如果你不反对使用find,我喜欢它的-prune特性: 查找[目录]\ name "pattern_to_exclude" -prune \ -o -name "another_pattern_to_exclude" -prune \ -o -name "pattern_to_INCLUDE" -print0 \ | xargs -0 -I FILENAME grep -IR "pattern"文件名

在第一行中,指定要搜索的目录。例如,(当前目录)是一个有效路径。

在第二和第三行,使用"*.png", "*.gif", "*.jpg",以此类推。使用尽可能多的-o -name "…"-修剪结构,因为你有模式。

在第4行,您需要另一个-o(它指定“或”来查找),这是您确实想要的模式,并且您需要在它的末尾使用-print或-print0。如果你只是想要修剪*.gif, *.png等图像后剩下的“其他所有东西”,那么使用 -o -print0,第四行就完成了。

最后,在第5行是通往xargs的管道,该管道接收每个结果文件并将它们存储在变量FILENAME中。然后它将-IR标志,即“模式”传递给grep,然后FILENAME被xargs扩展为find找到的文件名列表。

对于你的特定问题,陈述可能是这样的: 找到。\ -prune \ . name "*.png -o -name "*.gif" -prune \ -o -name "*。Svn " -修剪\ -o -print0 | xargs -0 -I FILES grep -IR "foo=" FILES

其他回答

试试这个:

 $ find . -name "*.txt" -type f -print | xargs file | grep "foo=" | cut -d: -f1

创立于:http://www.unix.com/shell-programming-scripting/42573-search-files-excluding-binary-files.html

如果你不反对使用find,我喜欢它的-prune特性: 查找[目录]\ name "pattern_to_exclude" -prune \ -o -name "another_pattern_to_exclude" -prune \ -o -name "pattern_to_INCLUDE" -print0 \ | xargs -0 -I FILENAME grep -IR "pattern"文件名

在第一行中,指定要搜索的目录。例如,(当前目录)是一个有效路径。

在第二和第三行,使用"*.png", "*.gif", "*.jpg",以此类推。使用尽可能多的-o -name "…"-修剪结构,因为你有模式。

在第4行,您需要另一个-o(它指定“或”来查找),这是您确实想要的模式,并且您需要在它的末尾使用-print或-print0。如果你只是想要修剪*.gif, *.png等图像后剩下的“其他所有东西”,那么使用 -o -print0,第四行就完成了。

最后,在第5行是通往xargs的管道,该管道接收每个结果文件并将它们存储在变量FILENAME中。然后它将-IR标志,即“模式”传递给grep,然后FILENAME被xargs扩展为find找到的文件名列表。

对于你的特定问题,陈述可能是这样的: 找到。\ -prune \ . name "*.png -o -name "*.gif" -prune \ -o -name "*。Svn " -修剪\ -o -print0 | xargs -0 -I FILES grep -IR "foo=" FILES

看这个。

grep --exclude="*\.svn*" -rn "foo=" * | grep -v Binary | grep -v tags

如果您只想跳过二进制文件,我建议您查看-I(大写I)选项。它忽略二进制文件。我经常使用以下命令:

grep -rI --exclude-dir="\.svn" "pattern" *

它会递归搜索,忽略二进制文件,并且不会在Subversion隐藏文件夹中查找我想要的任何模式。我在我工作的盒子上用"grepsvn"作为别名。

这些脚本并不能解决所有的问题……试试这个吧:

du -ha | grep -i -o "\./.*" | grep -v "\.svn\|another_file\|another_folder" | xargs grep -i -n "$1"

这个脚本非常好,因为它使用“真正的”正则表达式来避免目录搜索。只需在grep -v上用“\|”分隔文件夹或文件名即可

享受它! 在我的Linux shell上找到!XD