GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Drucken von Dateinamen zusammen mit Grep-Ergebnissen in Find -exec?

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

Linux
  1. Rekursives Grep Vs Find / -type F -exec Grep {}; Was ist effizienter/schneller?

  2. Grep mit logischen Operatoren?

  3. Auslassen der Erweiterung mit Find?

  4. Suchen -exec + Vs Finden | Xargs:Welche soll man wählen?

  5. Brechen Sie von Find ab, wenn ein -exec fehlschlägt?

Grep-Befehl in Linux (Text in Dateien suchen)

So finden Sie eine Zeichenfolge in einer Datei unter Linux

Finden Sie verlorene Dateien mit Scalpel

Finden Sie Text in Dateien unter Linux mit grep

Die Option -exec in Find zum Laufen bringen?

Grep-Befehl in Linux (mit Beispielen)