2013-02-11 120 views
7

要找到所有包含当前文件夹中的“富”的文件的文件,我用:查找不包含字符串

grep -r "foo" . 

要找到所有包含“栏中的”当前文件夹中的文件,我使用:

grep -r "bar" . 

但是如何找到所有不包含'foo'和'bar'的文件?

回答

13

要打印线不包含一些字符串,可以使用-v标志:

grep -r -v "bar" . | grep -v "foo" 

这使您做的所有行不包含foobar

要打印文件不包含某些字符串,请使用-L标志。为了不匹配几个字符串,可以使用与-P标志的正则表达式(也有可以使用几种正则表达式标志):

grep -r -L -P "(foo|bar)" . 

这将打印不包含foobar文件列表。

感谢Anton Kovalenko指出了这一点。

+3

错误的所有文件。 '-v'是关于非匹配行存在的,而不是关于*匹配行不存在*的。 – 2013-02-11 10:03:39

+0

@AntonKovalenko你是对的,我删除了管道中的'-r'。对于“不匹配的行”,这是OP所要求的:'grep -v“foo”'goves行与'foo'不匹配。 – alestanis 2013-02-11 10:05:10

+0

他询问了*根本不包含* foo和bar *的文件,而不是*包含一些非小节线和一些非foo行*的文件。 – 2013-02-11 10:06:18

1

使用awk,是这样的:

awk 'BEGIN {f=ARGV[1] ; ff=0} f != FILENAME { if (ff>0) { print f } ; ff=0 ; f=FILENAME } /SEARCHSTRING/ {ff=1} END {if (ff>0) { print f } }' INPUT_FILE_LIST(PATTERN) 

基本上它读取每一个输入文件,如果你看到SEARCHSTRING(可以是正则表达式),它保存这些信息。在完成当前文件(或最后一个文件之后)后,检查它是否找到了某些内容,如果是,则打印前一个文件名。

1

请尝试以下操作。这应该工作

grep -rL -P“(foo | bar)”。

3

试试这个:

grep -L -e "foo\|bar" * 
1

递归搜索目录中的那些不包含XYZ

find . -type f | xargs grep -L "XYZ"