字符串搜索:使用find / grep,忽略.git和其他目录

时间:2013-01-01 09:57:17

标签: command-line grep find

我经常需要从具有git目录.git/的目录中搜索特定字符串。这是我使用的命令:

find . -name .git -prune -o -print | xargs grep <string-to-search>

-name .git -prune -o -print选项是忽略.git/下的文件。但是,它会输出大量的'是一个目录'消息,这会使整个结果变得混乱。例如,

...
grep: ./reports: Is a directory
grep: ./scripts: Is a directory
grep: ./scripts/js: Is a directory
grep: ./scripts/js/adapter: Is a directory
...

如何修改命令行,以便我可以忽略.git/目录所有其他目录(即只搜索可搜索的文件)。

显然,-type f选项在以下方面效果不佳:

find -type f . -name .git -prune -o -print

4 个答案:

答案 0 :(得分:17)

您不需要find命令。您可以使用grep在目录中搜索。 您可以使用exclude-dir语法忽略目录。

grep -r --exclude-dir=".git;.svn" "string to search" <directory>

答案 1 :(得分:2)

在这里回答我自己的问题(不给予任何投票等):

由于我本质上是在git跟踪的目录中进行搜索,git grep显然更简单,更适合工作。感谢@Johnsyweb最初提出这个问题!

我选择了Vivek的答案,因为它提供了原始问题中提出的一般grep解决方案。

答案 2 :(得分:0)

-type f错位。它在-prune之前过滤掉目录,它需要一个目录名。该命令应为find . -name .git -prune -o -type f -print。如果您只想让grep关闭目录,可以设置环境变量GREP_OPTIONS='--directories=skip'

答案 3 :(得分:0)

建议您尝试ripgrep https://github.com/BurntSushi/ripgrep

<块引用>

ripgrep 是一个面向行的搜索工具,它递归地搜索当前目录以查找 正则表达式。默认情况下,ripgrep 将尊重 gitignore 规则和 自动跳过隐藏文件/目录和二进制文件。

它比其他工具(我遇到的)更快,对开发人员更友好,包括 grepfind