Eine der anderen Antworten kam dem nahe:
finden . -Typ d -exec sh -c 'cd "$ 0" && cmd ' {} \;
(Ausführen des Befehls nur, wenn dies cd
erfolgreich ist). Einige Leute empfehlen, ein Dummy-Argument einzufügen, damit das gefundene Verzeichnis ( {}
) zu Folgendem wechselt $1
:
finden . -Typ d -exec sh -c 'cd "$ 1" && cmd ' foo {} ";"
Natürlich können Sie hier anstelle von auch eine beliebige Zeichenfolge verwenden foo
. Gemeinsame Entscheidungen sind -
, --
und sh
. Diese Zeichenfolge wird in Fehlermeldungen (falls vorhanden) verwendet, z.
foo: Zeile 0: cd: eingeschränktes_Verzeichnis : Berechtigung verweigert
so sh
scheint eine gute Wahl zu sein.
\;
und ";"
sind absolut gleichwertig; Das ist nur eine Stilvorliebe.
Die obigen Befehle führen die Shell für jedes Verzeichnis einmal aus. Dies kann mit Leistungseinbußen verbunden sein (insbesondere wenn der auszuführende Befehl relativ leicht ist). Alternativen sind
finden . -Typ d -exec sh -c 'für d; do (cd "$ d" && cmd ); erledigt 'sh {} +
die die Shell einmal ausführt, aber für jedes Verzeichnis einmal gabelt, und
finden . -type d -exec sh -c 'save_d = $ PWD; für d; CD "$ d" && cmd ; cd "$ save_d"; erledigt 'sh {} +
das bringt keine Subshells hervor. Wenn Sie einen absoluten Pfad suchen, wie Ihre Frage nahelegt, können Sie das oben Genannte kombinieren und tun
find / home / test -typ d -exec sh -c 'für d; CD "$ d" && cmd ; erledigt 'sh {} +
Das bringt keine Subshells hervor und muss sich auch nicht darum kümmern, den Startpunkt zu speichern.
pwd
als Proof of Concept verwenden?