Ich versuche, grep
in angegebenen Dateien zu suchen, die wie folgt zurückgegeben werden find
:
find . -type d -name 'mydir*' -exec find '{}' -name '*.java' \; | grep 'MyClass'
Das funktioniert nicht.
Mittlerweile funktioniert das.
grep 'MyClass' $(find . -type d -name 'mydir*' -exec find '{}' -name '*.java' \;)
Was ist das Problem mit meinem ersten Beispiel?
Antwort1
Im ersten Fall greppen Sie die Liste der von zurückgegebenen Dateinamen find
, während im zweiten Fall die Dateinamenliste ein Argument für grep ist, sodass grep in den Dateien sucht.
Pipe ist eine Standardeingabe, keine benannte Datei. Deshalb verhält sich grep anders.
Von man grep
:
grep durchsucht die benannten Eingabedateien (oder die Standardeingabe, wenn keine Dateien benannt sind oder wenn als Dateiname ein einzelnes Bindestrich-Minuszeichen (-) angegeben ist) nach Zeilen, die eine Übereinstimmung mit dem angegebenen MUSTER enthalten.
Antwort2
Denn im ersten Fall grep
versucht es, „MyClass“ in Dateinamen zu finden, und im zweiten Fall versucht es, „MyClass“ im Dateiinhalt zu finden.
Der erste ist gleich
find . -type d -name 'mydir*' -exec find '{}' -name '*MyClass*.java' \;
während der zweite gleich ist
find . -type d -name 'mydir*' -exec sh -c \
"find '{}' -name '*.java' -exec grep 'MyClass' {} \;" \;
Antwort3
Ich denke, Ihr find
Befehl sollte lauten:
find . -type f -path 'mydir*.java'| xargs grep -H 'MyClass'
Findet Dateien mydir
mit .java
der Erweiterung und enthältMeine Klasse. -H
weist an grep
, den Dateinamen vor dem Ergebnis auszugeben.