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


当前回答

如果你的grep有-L(或——files-without-match)选项:

$ grep -L "foo" *

其他回答

打开错误报告

正如@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

下面的命令可以帮助你过滤包含子字符串“foo”的行。

cat file | grep -v "foo"

当grep没有-L选项时(例如IBM AIX),只有grep和shell时的另一种选择:

for file in * ; do grep -q 'my_pattern' $file || echo $file ; done

find *20161109* -mtime -2|grep -vwE "(触发器)"

你可以在"find"下指定过滤器,在"grep -vwE"下指定排除字符串。如果你也需要对修改后的时间进行过滤,请在find下使用mtime。

如果你的grep有-L(或——files-without-match)选项:

$ grep -L "foo" *