it-swarm.com.de

Wie binde ich eine Pipe ein? in meinem linux find -exec befehl?

Das funktioniert nicht. Kann das in find gemacht werden? Oder muss ich xargs?

find -name 'file_*' -follow -type f -exec zcat {} \| agrep -dEOE 'grep' \;
191
someguy

Die Aufgabe, das Pipe-Symbol als Anweisung zum Ausführen mehrerer Prozesse zu interpretieren und die Ausgabe eines Prozesses in die Eingabe eines anderen Prozesses zu leiten, liegt in der Verantwortung der Shell (/ bin/sh oder gleichwertig).

In Ihrem Beispiel können Sie entweder Ihre Shell der obersten Ebene verwenden, um die Verrohrung wie folgt durchzuführen:

find -name 'file_*' -follow -type f -exec zcat {} \; | agrep -dEOE 'grep'

In Bezug auf die Effizienz kostet dieses Ergebnis einen Aufruf von find, zahlreiche Aufrufe von zcat und einen Aufruf von agreep.

Dies würde dazu führen, dass nur ein einziger Agrep-Prozess erzeugt wird, der die gesamte Ausgabe verarbeiten würde, die durch zahlreiche Aufrufe von zcat erzeugt wird.

Wenn Sie aus irgendeinem Grund agreep mehrmals aufrufen möchten, können Sie Folgendes tun:

find . -name 'file_*' -follow -type f \
    -printf "zcat %p | agrep -dEOE 'grep'\n" | sh

Dadurch wird eine Liste von Befehlen erstellt, die mit Pipes ausgeführt werden, und diese werden dann an eine neue Shell gesendet, um sie tatsächlich auszuführen. (Das Weglassen des letzten "| sh" ist eine gute Möglichkeit, Befehlszeilen wie diese zu debuggen oder zu testen.)

In Bezug auf die Effizienz kostet dieses Ergebnis einen Aufruf von find, einen Aufruf von sh, zahlreiche Aufrufe von zcat und zahlreiche Aufrufe von agreep.

Die effizienteste Lösung in Bezug auf die Anzahl der Befehlsaufrufe ist der Vorschlag von Paul Tomblin:

find . -name "file_*" -follow -type f -print0 | xargs -0 zcat | agrep -dEOE 'grep'

... was einen Aufruf von find, einen Aufruf von xargs, ein paar Aufrufe von zcat und einen Aufruf von agreep kostet.

131

die lösung ist einfach: über sh ausführen

... -exec sh -c "zcat {} | agrep -dEOE 'grep' " \;
249
flolo
find . -name "file_*" -follow -type f -print0 | xargs -0 zcat | agrep -dEOE 'grep'
16
Paul Tomblin

Sie können auch eine Pipeline an eine while -Schleife senden, die mehrere Aktionen für die Datei ausführen kann, die find findet. Hier ist eine, um in jar Archiven nach einer bestimmten Java= Klassendatei in einem Ordner mit einer großen Distribution von jar Dateien zu suchen

find /usr/lib/Eclipse/plugins -type f -name \*.jar | while read jar; do echo $jar; jar tf $jar | fgrep IObservableList ; done

der entscheidende Punkt ist, dass die while -Schleife mehrere Befehle enthält, die auf den durch Semikolon getrennten übergebenen Dateinamen verweisen. Diese Befehle können Pipes enthalten. In diesem Beispiel gebe ich den Namen der übereinstimmenden Datei wieder und liste dann auf, was in der Archivfilterung für einen bestimmten Klassennamen enthalten ist. Die Ausgabe sieht folgendermaßen aus:

/usr/lib/Eclipse/plugins/org.Eclipse.core.contenttype.source_3.4.1.R35x_v20090826-0451.jar /usr/lib/Eclipse/plugins/org.Eclipse.core.databinding.observable_1.2.0.M20090902-0800 .jar org/Eclipse/core/datenbindung/observable/list/IObservableList. class /usr/lib/Eclipse/plugins/org.Eclipse.search.source_3.5.1.r351_v20090708-0800.jar/usr /lib/Eclipse/plugins/org.Eclipse.jdt.apt.core.source_3.3.202.R35x_v20091130-2300.jar /usr/lib/Eclipse/plugins/org.Eclipse.cvs.source_1.0.400.v201002111343.jar/us /lib/Eclipse/plugins/org.Eclipse.help.appserver_3.1.400.v20090429_1800.jar

in meiner Bash-Shell (xubuntu10.04/xfce) wird der übereinstimmende Klassenname wirklich fett dargestellt, da fgrep den übereinstimmenden String hervorhebt. Dies macht es wirklich einfach, die Liste von Hunderten von jar Dateien, die durchsucht wurden, zu durchsuchen und Übereinstimmungen leicht zu erkennen.

unter Windows können Sie dasselbe tun mit:

for /R %j in (*.jar) do @echo %j & @jar tf %j | findstr IObservableList

beachten Sie, dass in Windows das Befehlstrennzeichen '&' nicht 'ist.' und dass das '@' das Echo des Befehls unterdrückt, um eine aufgeräumte Ausgabe zu erhalten, genau wie die Ausgabe von linux find oben; obwohl findstr die übereinstimmende Zeichenfolge nicht fett formatiert, müssen Sie die Ausgabe etwas genauer betrachten, um den übereinstimmenden Klassennamen zu sehen. Es stellt sich heraus, dass der Windows-Befehl 'for' einige Tricks wie das Durchlaufen von Textdateien kennt ...

genießen

9
simbo1905