我在目录树中寻找字符串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)。
在目录中还有许多二进制文件。我不能只搜索某些目录(目录结构是一个大混乱)。有没有更好的方法只在特定的文件中进行grepping ?
ripgrep
这是设计用于递归搜索当前目录的最快工具之一。它是用Rust编写的,构建在Rust的正则表达式引擎之上,以获得最大的效率。点击这里查看详细分析。
所以你可以运行:
rg "some_pattern"
它尊重你的.gitignore和自动跳过隐藏文件/目录和二进制文件。
您仍然可以使用-g/——glob自定义包含或排除文件和目录。Globbing规则匹配。gitignore globs。联系rg寻求帮助。
有关更多示例,请参见:如何使用grep排除与某些扩展名不匹配的文件?
在macOS上,你可以通过brew install ripgrep进行安装。
Find和xargs是你的朋友。使用它们来过滤文件列表,而不是grep的——exclude
试试这样的方法
find . -not -name '*.png' -o -type f -print | xargs grep -icl "foo="
习惯这一点的好处是,它可以扩展到其他用例,例如计算所有非png文件中的行数:
find . -not -name '*.png' -o -type f -print | xargs wc -l
删除所有非png文件。
find . -not -name '*.png' -o -type f -print | xargs rm
etc.
正如评论中指出的,如果某些文件的名称中可能有空格,请使用-print0和xargs -0代替。