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 {} +