如何找出当前目录中不包含单词foo(使用grep)的文件?
当前回答
当grep没有-L选项时(例如IBM AIX),只有grep和shell时的另一种选择:
for file in * ; do grep -q 'my_pattern' $file || echo $file ; done
其他回答
您可以单独使用grep(没有find)来完成。
grep -riL "foo" .
这是对grep上使用的参数的解释
-L, --files-without-match
each file processed.
-R, -r, --recursive
Recursively search subdirectories listed.
-i, --ignore-case
Perform case insensitive matching.
如果你使用l(小写),你将得到相反的(文件匹配)
-l, --files-with-matches
Only the names of files containing selected lines are written
你实际上需要:
find . -not -ipath '.*svn*' -exec grep -H -E -o -c "foo" {} \; | grep :0\$
下面的命令给出了所有不包含foo模式的文件:
find . -not -ipath '.*svn*' -exec grep -H -E -o -c "foo" {} \; | grep 0
当您使用find时,您有两个基本选项:在find完成搜索后过滤结果,或者使用一些内置选项来阻止find考虑那些匹配某些给定模式的文件和dirs。
如果您在大量的文件和dirs上使用前一种方法。您将使用大量的CPU和RAM来将结果传递给第二个进程,而第二个进程反过来也会使用大量的资源来过滤结果。
如果你使用-not关键字作为一个find参数,你将阻止任何与后面的name或-regex参数上的字符串匹配的路径被考虑,这将更有效。
find . -not -regex ".*/foo/.*" -regex ".*"
然后,任何没有被-not过滤掉的路径都将被后续的-regex参数捕获。
下面的命令不需要find通过使用第二个grep来过滤svn文件夹。
grep -rL "foo" ./* | grep -v "\.svn"
推荐文章
- 在Windows中有像GREP这样的模式匹配实用程序吗?
- 如何在Python中获得所有直接子目录
- 即使模板文件存在,Flask也会引发TemplateNotFound错误
- 如何从命令行将每两行合并为一行?
- 如何复制在bash所有目录和文件递归?
- 如何在Ruby中创建文件
- __FILE__宏显示完整路径
- 匹配前后的Grep字符?
- (grep)正则表达式匹配非ascii字符?
- 如何从另一个文件A中删除文件B中出现的行?
- 如何使用查找命令从列表中查找所有具有扩展名的文件?
- 如何将文件指针(file * fp)转换为文件描述符(int fd)?
- 如何删除文件中的特定行?
- 使用Java重命名文件
- PowerShell等价于grep -f