Ich habe ein Programm namens foo
die ich für jedes Ergebnis ausführen möchte, das über find gefunden wird. Also etwa so:
find . -name '*.o' -type f -exec foo {} ;
Ich möchte die Ausgabe all dieser Aufrufe von foo
grep für einen bestimmten Saitenstab. Also füge ich Folgendes hinzu:
find . -name '*.o' -type f -exec foo {} ; | grep bar
Aber ich verliere die ursprünglichen Informationen darüber, aus welchen Dateien die Übereinstimmungen stammen. Ich habe versucht, -fprintf /dev/stderr '%pn'
hinzuzufügen zum find
Befehl, aber jetzt sieht es so aus, als wäre stdout weg, weil keine grep-Ergebnisse ausgegeben werden.
Wie kann ich jeden Dateinamen in der Ausgabe ausgeben lassen und DANN die grep-Ergebnisse entsprechend dieser Datei danach ausgeben lassen?
Alternativ, wenn es eine Möglichkeit gäbe, das -H
zu machen Argument von grep
Arbeit, die auch in Ordnung wäre, aber wie geschrieben, wird es nicht funktionieren, weil ich nur Text von stdin und grep
übergebe kennt den Dateinamen nicht. Ich habe verschiedene Beschwörungen von xargs
ausprobiert , aber ich konnte auch nichts davon zum Laufen bringen.
Akzeptierte Antwort:
Um jeden Dateinamen in der Ausgabe auszugeben und DANN die grep-Ergebnisse entsprechend dieser Datei danach auszugeben, könnten Sie -exec foo {} | grep
Pipe in einer Shell:
find . -name '*.o' -type f -print -exec sh -c 'foo "$1" | grep "bar"' sh {} ;
Um das -H
zu machen Argument von grep funktioniert mit der Standardeingabe, wenn Ihre Version von grep
unterstützt das --label=
Option, die Sie tun könnten
find . -name '*.o' -type f -exec sh -c '
foo "$1" | grep -H --label="$1" "bar"
' sh {} ;
oder (wenn Ihr Fund den +
unterstützt Alternative mit mehreren Argumenten zu ;
):
find . -name '*.o' -type f -exec sh -c '
for f; do foo "$f" | grep -H --label="$f" "bar"; done
' sh {} +