Ist es möglich, "find -exec" -Erweiterungs-Backticks für jede gefundene Datei zu erhalten?

9

Hier ist ein Befehl, der gut funktioniert:

echo Blah: `stat -c %a .`

Ist es möglich, find -execdasselbe für jede gefundene Datei {}anstelle von auszuführen .?

RomanSt
quelle
1
Backticks können dort nicht funktionieren, da sie einmal ausgewertet werden, bevor sie findüberhaupt ausgeführt werden, und das Ergebnis als statischer Parameter für die Suche verwendet wird.
Sven

Antworten:

10

Der beste Weg, dies zu tun, ist die Verwendung von Positionsparametern. Und $()ist bevorzugt für Kommandosubstitution ove Backticks , weil es besser lesbar ist (nicht mit einfachen Anführungszeichen zu verwechseln) und kann leicht , ohne viel zu entkommen zu tun haben verschachtelt werden.

find . -exec bash -c 'echo Blah: $(stat -c %a "$@")' _ {} \;

Der Unterstrich ist ein Platzhalter für $0.

Bis auf weiteres angehalten.
quelle
6

Wozu?

find ... -printf 'Blah: %m\n'

Oder verwenden bash -cSie, wenn Sie wirklich müssen:

 find . -exec bash -c 'echo Blah: `stat -c %a {}`' \;
Ignacio Vazquez-Abrams
quelle
Vielen Dank für die Lösung meines unmittelbaren Problems, aber ich bin immer noch gespannt, ob Backticks wie beschrieben verwendet werden können. Nur um meinen Horizont zu erweitern.
RomanSt
Sie müssten die Shell über bash -coder ähnlich aufrufen .
Ignacio Vazquez-Abrams
0

Die einzige Möglichkeit, sie zu verwenden (AFAIK), besteht darin, sie in einer Bash-Skriptdatei abzulegen und das Skript in -exec zu verwenden. Gleiches mit$()

Hubert Kario
quelle
0

Vergiss nicht xargs! Ihr Beispiel würde für jede gefundene Datei einen neuen Shell-Prozess aufrufen.

Ich würde das vorziehen:

find ... | xargs stat -c "Blah: %a"

findgibt eine Liste aller gefundenen Elemente aus, xargsliest eine Liste der Argumente stdinund führt ihren Parameter mit diesen Argumenten in der Befehlszeile aus, wobei eine so lange Befehlszeile wie möglich erstellt wird. Es funktioniert, weil stat, wie die meisten anderen richtigen Befehle / Programme, eine beliebige Anzahl von Parametern verwendet wird. (vergleichen ls, rmundecho zum Beispiel)

Wenn Sie der Meinung sind, dass es unbedingt erforderlich ist, für jede Datei einen neuen Prozess zu starten xargs -n 1, übergeben Sie nur 1Parameter an jeden Befehl. Auf diese Weise können Sie die ineffizienten Methoden wie folgt nachahmen:

find ... | xargs -n 1 stat -c "Blah: %a"

(Versuchen Sie es auf einem großen Dateisystem auf einem langsamen Computer und messen Sie die Unterschiede!)

MattBianco
quelle
Ich schätze die Mühe, aber ich brauche diese Backticks. Offensichtlich ist mein Beispiel vereinfacht und verwendet echo + stat; Das eigentliche Skript verwendet weder Echo noch stat, sodass Ihr Trick, sie in der Formatzeichenfolge von stat zusammenzusetzen, überhaupt nicht hilft.
RomanSt