2013-02-11 114 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"