我经常需要从具有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
答案 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 规则和 自动跳过隐藏文件/目录和二进制文件。
它比其他工具(我遇到的)更快,对开发人员更友好,包括 grep
和 find