Warum gibt die Weiterleitung von „find“ und „grep“ nichts zurück?

Warum gibt die Weiterleitung von „find“ und „grep“ nichts zurück?

Ich versuche, grepin 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 grepversucht 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 findBefehl sollte lauten:

find . -type f -path 'mydir*.java'| xargs grep -H 'MyClass'

Findet Dateien mydirmit .javader Erweiterung und enthältMeine Klasse. -Hweist an grep, den Dateinamen vor dem Ergebnis auszugeben.

verwandte Informationen