6

我经常需要从具有 git directory 的目录中搜索特定字符串.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

4 回答 4

22

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

grep -r --exclude-dir=".git;.svn" "string to search" <directory>
于 2013-01-01T10:00:23.933 回答
3

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

由于我本质上是专门在git-tracked 目录中进行搜索,git grep因此显然是更简单、更适合这项工作的工具。感谢最初提出这个问题的@Johnsyweb!

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

于 2013-02-27T18:46:24.687 回答
0

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

于 2014-07-11T23:53:16.680 回答
0

推荐你试试ripgrep https://github.com/BurntSushi/ripgrep

ripgrep 是一种面向行的搜索工具,它递归地在当前目录中搜索正则表达式模式。默认情况下,ripgrep 将遵守 gitignore 规则并自动跳过隐藏文件/目录和二进制文件。

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

于 2021-07-14T14:24:13.280 回答