Wie grep verwendet, um alle Dateien zu finden, die ein Muster enthalten, aber nicht über eine Sekunde?

StackOverflow https://stackoverflow.com/questions/1422292

  •  07-07-2019
  •  | 
  •  

Frage

Gibt es eine einfache Möglichkeit, grep (oder mit anderen Standard-Kommandozeilen-Tool kombinieren), um eine Liste aller Dateien zu erhalten, die noch ein Muster enthält kein zweites Muster hat?

In meinem speziellen Fall möchte ich eine Liste aller Dateien, die das Muster enthalten:

override.*commitProperties

noch nicht enthalten:

super.commitProperties

Ich bin auf Windows, sondern verwenden Cygwin ausgiebig. Ich weiß, wie entweder alle Dateien mit dem ersten Muster zu finden oder alle Muster ohne die zweiten, aber ich bin nicht sicher, wie diese Abfragen zu kombinieren.

Ich würde es vorziehen, Antworten, die generisch sind, wie ich das Gefühl, viele andere Leute haben könnte diese Art der Abfrage nützlich finden. Es ist einfach genug für mich in meinen Werten eine generische Lösung und Stecker zu nehmen. Ich enthalten nur meinen speziellen Fall der Erklärung leichter zu machen.

War es hilfreich?

Lösung

grep -rl "override.*commitProperties" . | xargs grep -L "super.commitProperties"

-l druckt die Dateien mit einem Spiel

-L druckt die Dateien, ohne eine Übereinstimmung

Andere Tipps

Versuchen

find . -print0 | xargs -0 grep -l "override.*commitProperties" \
| tr '\012' '\000' | xargs -0 grep -L super.commitProperties

Der tr Befehl Zeilenumbrüche konvertieren zu null ascii, so dass Sie -0 in dem zweiten xargs verwenden können, um alle Probleme mit Leerzeichen in Dateinamen zu vermeiden etc.

Tester:

/tmp/test>more 1 2 3 | cat
::::::::::::::
1
::::::::::::::
override.*commitProperties
super.commitProperties
::::::::::::::
2
::::::::::::::
override.*commitProperties
::::::::::::::
3
::::::::::::::
hello world
/tmp/test>find . -print0 | xargs -0 grep -l "override.*commitProperties" | tr '\012' '\000' | xargs -0 grep -L super.commitProperties
./2
/tmp/test>

Wie von Douglas erwähnt, + xargs finden durch grep -r substituiert sein werden.

eine Kombination von 2 greps verwenden und eine comm, wie folgt (Muster A und B). Bitte beachten Sie, dass ein verrohrt grep wird nicht funktionieren, da die Muster auf unterschiedliche Linien sein könnten.

$ cat a
A
$ cat b
B
$ cat ab
A
B

$ grep -l A * > A.only
$ grep -l B * > B.only  

$ comm -23 A.only B.only 
a

Hinweis: comm Befehl druckt die Linien gemeinsam oder einzigartig in zwei Dateien. „-23“ drucken Zeilen eindeutig erste Datei -. Also Dateinamen in der zweiten Datei unterdrücken

Meine Lösung ist ähnlich wie Douglas Leeder ist, außer ich xargs nicht verwenden:

grep -l 'override.*commitProperties' $(grep -L super.commitProperties *.txt)

Die grep -L Befehl Produkt eine Liste der Dateien, die nicht das Muster enthält super.commitProperties , die grep -l Befehl aussieht für die * außer Kraft setzen. commitProperties Muster aus dieser Liste.

Insgesamt ist es eine andere Art und Weise der Katze Haut.

ack -l --make "override.*commitProperties" | xargs ack -L "super.commitProperties"

Ich habe diesen Thread und versuchte, eine rekursive Lookup zu tun. Es wurde unter 25 Minuten + so statt über ack herausgefunden. Hat es in 5 Minuten.

Handy-Tool ack.

    grep "override.*commitProperties" *| grep -v "super.commitProperties" | cut -d":" -f1
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top