我正在foo=目录树的文本文件中查找字符串。它在一台普通的 Linux 机器上,我有 bash shell:
foo=
grep -ircl "foo=" *
目录中还有许多匹配的二进制文件"foo="。由于这些结果不相关并且会减慢搜索速度,因此我希望 grep 跳过搜索这些文件(主要是 JPEG 和 PNG 图像)。我该怎么做?
"foo="
我知道有--exclude=PATTERNand--include=PATTERN选项,但是模式格式是什么?grep 的手册页说:
--exclude=PATTERN
--include=PATTERN
--include=PATTERN Recurse in directories only searching file matching PATTERN. --exclude=PATTERN Recurse in directories skip file matching PATTERN.
在 grep include 、 grep include exclude 、 grep exclude 和变体上搜索未找到任何相关内容
如果只有在某些文件中有更好的 grepping 方法,我完全赞成;移动有问题的文件不是一种选择。我不能只搜索某些目录(目录结构很乱,到处都是)。另外,我无法安装任何东西,所以我必须使用常用工具(如 grep 或建议的 find )。
使用 shell通配符语法:
grep pattern -r --include=\*.cpp --include=\*.h rootdir
for 的语法--exclude是相同的。
--exclude
请注意,星号用反斜杠转义,以防止它被外壳扩展(引用它,例如--include="*.cpp",也可以)。否则,如果您在当前工作目录中有与该模式匹配的任何文件,命令行将扩展为类似 的grep pattern -r --include=foo.cpp --include=bar.cpp rootdir内容,它只会搜索名为foo.cppand的文件bar.cpp,这很可能不是您想要的。
--include="*.cpp"
grep pattern -r --include=foo.cpp --include=bar.cpp rootdir
foo.cpp
bar.cpp
2021-03-04 更新
我已经编辑了原始答案以删除使用大括号扩展,这是 Bash 和 zsh 等几个 shell 提供的一个功能,用于简化这样的模式;但请注意,大括号扩展不符合 POSIX shell。
原来的例子是:
grep pattern -r --include=\*.{cpp,h} rootdir
搜索根目录中的.cpp所有文件。.h``rootdir
.cpp
.h``rootdir