2013-02-11 20 views
7

Um alle Dateien zu finden, die „foo“ in aktuellen Ordner enthalten, die ich benutze:Dateien, die keine Zeichenfolge enthält

grep -r "foo" . 

Um alle Dateien zu finden, die „bar“ in aktuellen Ordner enthalten, I verwenden:

grep -r "bar" . 

Aber wie findet man alle Dateien, die nicht "foo" und "bar" enthalten?

Antwort

13

Linien drucken, die Sie nicht einige Zeichenfolge enthalten, verwenden Sie die -v Flagge:

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

Dies gibt Ihnen alle Zeilen, die nichtfoo oder bar enthalten .

Zum Drucken von Dateien, die keine Zeichenfolge enthalten, verwenden Sie das Flag -L. Um nicht-Spiel mehrere Strings, Sie reguläre Ausdrücke mit der -P Flag verwenden können (es gibt mehrere Regex Flags, die Sie verwenden können):

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

Dieser druckt eine Liste von Dateien, die nicht foo oder bar enthalten.

Dank Anton Kovalenko für das hinweisend.

+3

Falsch. '-v' handelt von nicht übereinstimmenden Zeilen, nicht von * übereinstimmenden Zeilen, die fehlen *. –

+0

@AntonKovalenko Du hast recht, ich habe das '-r' im Rohr entfernt. Für die "nicht übereinstimmenden Linien" verlangt das OP Folgendes: 'grep -v" foo "' Goves-Linien, die nicht mit 'foo' übereinstimmen. – alestanis

+0

Er fragt nach Dateien, die * nicht * foo und bar * überhaupt * enthalten, nicht über Dateien, die einige Nicht-Strich-Zeilen und einige Nicht-Zeilen-Zeilen * enthalten. –

1

Mit awk, so etwas wie:

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) 

Grundsätzlich liest er jede Eingabedatei und wenn sieht Ihre SEARCHSTRING (die einen regulären Ausdruck sein kann), speichert es, dass Informationen. Überprüfen Sie nach dem Beenden der aktuellen Datei (oder nach der letzten Datei), ob etwas gefunden wurde, und wenn ja, drucken Sie den vorherigen Dateinamen.

1

Versuchen Sie die folgenden. das sollte funktionieren

grep -rL -P "(foo | bar)".

3

Versuchen Sie dieses:

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

Recursively sucht Verzeichnisse für alle Dateien, die nicht XYZ tun enthält

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