Ich versuche, einen Suchbefehl zu erstellen, um eine Reihe von Dateien in einem Verzeichnis mit zwei verschiedenen ausführbaren Dateien zu verarbeiten. Leider -exec
erlaubt on find die Verwendung von Pipe nicht oder auch nicht, \|
weil die Shell dieses Zeichen zuerst interpretiert.
Hier ist genau das, was ich versuche (was nicht funktioniert, weil Pipe den Befehl find beendet):
find /path/to/jpgs -type f -exec jhead -v {} | grep 123 \; -print
Mit können
-exec
Sie nur eine einzige ausführbare Datei mit einigen Argumenten ausführen, nicht mit beliebigen Shell-Befehlen. Um dies zu umgehen, können Sie verwendensh -c '<shell command>'
.Beachten Sie, dass die Verwendung von
-exec
ziemlich ineffizient ist. Für jede gefundene Datei muss der Befehl erneut ausgeführt werden. Es wäre effizienter, wenn Sie dies vermeiden könnten. (Zum Beispiel durch Verschieben dergrep
Außenseite-exec
oder Verrohrung der Ergebnisse vonfind
to,xargs
wie von Palmin vorgeschlagen .)quelle
find
als auch in vorhanden istxargs
.Die Verwendung eines
find
Befehls für diese Art von Aufgabe ist möglicherweise nicht die beste Alternative. Ich verwende häufig den folgenden Befehl, um Dateien zu finden, die die angeforderten Informationen enthalten:for i in dist/*.jar; do echo ">> $i"; jar -tf "$i" | grep BeanException; done
quelle
Da dies eine Liste ausgibt, würden Sie nicht:
find /path/to/jpgs -type f -exec jhead -v {} \; | grep 123
oder
find /path/to/jpgs -type f -print -exec jhead -v {} \; | grep 123
Setzen Sie Ihren Grep auf die Ergebnisse der find -exec.
quelle
Es gibt eine andere Möglichkeit, dies zu tun, aber es ist auch ein hübsches Ghetto.
Mit der Shell-Option extquote können Sie etwas Ähnliches tun, um Exec-Zeug zu finden und es dann an sh weiterzuleiten.
root@ifrit findtest # find -type f -exec echo ls $"|" cat \;|sh filename
root@ifrit findtest # find -type f -exec echo ls $"|" cat $"|" xargs cat\;|sh h
Ich dachte nur, ich würde das hinzufügen, weil es zumindest so, wie ich es mir vorgestellt habe, näher an der ursprünglichen Frage des OP war, Pipes in exec zu verwenden.
quelle