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


当前回答

我运气很好

grep -H -E -o -c "foo" */*/*.ext | grep ext:0

我用grep -v的尝试只是给了我所有没有“foo”的行。

其他回答

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

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

ack -L foo

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

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

为了完整,ripgrep版本如下:

rg --files-without-match "pattern"

你可以结合文件类型和搜索路径,例如:

rg --files-without-match -t ruby "frozen_string_literal: true" app/

当您使用find时,您有两个基本选项:在find完成搜索后过滤结果,或者使用一些内置选项来阻止find考虑那些匹配某些给定模式的文件和dirs。

如果您在大量的文件和dirs上使用前一种方法。您将使用大量的CPU和RAM来将结果传递给第二个进程,而第二个进程反过来也会使用大量的资源来过滤结果。

如果你使用-not关键字作为一个find参数,你将阻止任何与后面的name或-regex参数上的字符串匹配的路径被考虑,这将更有效。

find . -not -regex ".*/foo/.*" -regex ".*"

然后,任何没有被-not过滤掉的路径都将被后续的-regex参数捕获。

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

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

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

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

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