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 -c
Sie, wenn Sie wirklich müssen:
find . -exec bash -c 'echo Blah: `stat -c %a {}`' \;
bash -c
oder ä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"
find
gibt eine Liste aller gefundenen Elemente aus, xargs
liest eine Liste der Argumente stdin
und 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
, rm
undecho
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 1
Parameter 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.