如何找出当前目录中不包含单词foo(使用grep)的文件?
当前回答
你实际上需要:
find . -not -ipath '.*svn*' -exec grep -H -E -o -c "foo" {} \; | grep :0\$
其他回答
你实际上需要:
find . -not -ipath '.*svn*' -exec grep -H -E -o -c "foo" {} \; | grep :0\$
我运气很好
grep -H -E -o -c "foo" */*/*.ext | grep ext:0
我用grep -v的尝试只是给了我所有没有“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
下面的命令不需要find通过使用第二个grep来过滤svn文件夹。
grep -rL "foo" ./* | grep -v "\.svn"
我的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 ">"
推荐文章
- 在Windows中有像GREP这样的模式匹配实用程序吗?
- 如何在Python中获得所有直接子目录
- 即使模板文件存在,Flask也会引发TemplateNotFound错误
- 如何从命令行将每两行合并为一行?
- 如何复制在bash所有目录和文件递归?
- 如何在Ruby中创建文件
- __FILE__宏显示完整路径
- 匹配前后的Grep字符?
- (grep)正则表达式匹配非ascii字符?
- 如何从另一个文件A中删除文件B中出现的行?
- 如何使用查找命令从列表中查找所有具有扩展名的文件?
- 如何将文件指针(file * fp)转换为文件描述符(int fd)?
- 如何删除文件中的特定行?
- 使用Java重命名文件
- PowerShell等价于grep -f