Antworten:
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.
Wozu?
find ... -printf 'Blah: %m\n'
Oder verwenden bash -cSie, wenn Sie wirklich müssen:
find . -exec bash -c 'echo Blah: `stat -c %a {}`' \;
bash -coder ähnlich aufrufen .
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$()
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!)
findüberhaupt ausgeführt werden, und das Ergebnis als statischer Parameter für die Suche verwendet wird.