Bash 我可以在树中的所有文本文件(但不是二进制文件)中搜索某个字符串吗

Bash 我可以在树中的所有文本文件(但不是二进制文件)中搜索某个字符串吗,bash,shell,unix,find,grep,Bash,Shell,Unix,Find,Grep,到目前为止,我最好的方法是(在包含大型C程序的目录中查找字符串) 它工作得很好,但它依赖于.mk makefile、.c或.h源文件和.s汇编文件中所有有趣的东西 我曾考虑添加“所有名为Makefile的文件”或“所有*.py python脚本”之类的内容,但如果有某种方法告诉find只查找文本文件,则会更容易 如果你只是在所有文件上运行grep,这需要很长时间,而且你会在目标文件上得到很多无趣的点击。GNU grep支持-I选项,这使得它将二进制文件(通过查看前几个字节确定)视为不匹配,因此它

到目前为止,我最好的方法是(在包含大型C程序的目录中查找字符串)

它工作得很好,但它依赖于.mk makefile、.c或.h源文件和.s汇编文件中所有有趣的东西

我曾考虑添加“所有名为Makefile的文件”或“所有*.py python脚本”之类的内容,但如果有某种方法告诉find只查找文本文件,则会更容易


如果你只是在所有文件上运行grep,这需要很长时间,而且你会在目标文件上得到很多无趣的点击。

GNU grep支持
-I
选项,这使得它将二进制文件(通过查看前几个字节确定)视为不匹配,因此它们基本上被跳过。

你看过吗

使用ack的前10个原因:

ack忽略了大部分你不想搜索的垃圾

  • 二进制文件、核心转储等
grep-rI
'-r'开关使grep递归,'-I'使其忽略二进制文件


有额外的开关用于排除某些文件和目录(例如,我经常这样做是为了排除svn元数据)

您可以使用
grep-I
忽略二进制文件。使用而不是xargs将允许您将工作分解为多个进程,利用一些并行性来提高速度

文档中提供了一个如何执行并行grep的示例:


Thx a ton,我一直在搜索这个,被SU上的人搞糊涂了,他们说所有东西都是二进制文件?!
find ~/example_directory -type f \( -name "*.mk" -or -name "*.[sch]" \) -print0 | xargs -0 -e grep "example_string"
grep -rI <path> <pattern>
find -type f | parallel -k -j150% -n 1000 -m grep -I "example_string"