如何找出当前目录中不包含单词foo(使用grep)的文件?


当前回答

打开错误报告

正如@tukan所评论的,Ag有一个关于-L/——files-without-matches标志的开放错误报告:

Ggreer /the_silver_searcher: #238 -——files-without-matches不能正常工作

由于bug报告几乎没有进展,所以不应该依赖下面提到的-L选项,只要bug还没有解决。请使用本文中介绍的不同方法。引用bug报告的注释[强调我的]:

有最新进展吗?-L完全忽略文件第一行的匹配项。似乎如果这个问题不会很快得到解决,这个标志应该被完全移除,因为它根本不像宣传的那样有效。


Silver Searcher - Ag(预期功能-见错误报告)

作为grep的强大替代品,您可以使用the Silver Searcher - Ag:

一个类似于ack的代码搜索工具,专注于速度。

查看man ag,我们找到了-L或——files-without-matches选项:

... 选项 ... - l - files-without-matches 只打印不包含匹配项的文件名。

也就是说,从当前目录中递归搜索不匹配foo的文件:

ag -L foo

要只搜索当前目录中不匹配foo的文件,只需为递归指定——depth=0:

ag -L foo --depth 0

其他回答

来看看ack。它自动为您排除.svn,为您提供Perl正则表达式,并且是一个简单的Perl程序下载。

在ack中,与你要找的内容等价:

ack -L foo

我的grep没有任何-L选项。我确实找到了解决办法。

这些想法是:

将包含相应字符串的所有文件名转储到txt1.txt。 将目录中的所有文件名转储到txt2.txt文件中。 使用diff命令区分2个转储文件。 Grep 'foo' *.log | cut -c1-14 | uniq > txt1.txt Grep * *.log | cut -c1-14 | uniq > txt2.txt Diff txt1.txt txt2.txt | grep ">"

这可能会对其他人有所帮助。我有混合文件Go和测试文件。但我只需要。go文件。所以我用了

ls *.go | grep -v "_test.go"

-v,——invert-match选择不匹配的行参见https://stackoverflow.com/a/3548465

也可以使用vscode从终端打开所有文件

code $(ls *.go | grep -v "_test.go")

如果你正在使用git,它会搜索所有被跟踪的文件:

git grep -L "foo"

如果你打开了**子目录globbing,你可以在跟踪文件的子集中搜索(在.bashrc中使用shopt -s globstar):

git grep -L "foo" -- **/*.cpp

下面的命令不需要find通过使用第二个grep来过滤svn文件夹。

grep -rL "foo" ./* | grep -v "\.svn"