Wenn Sie GNU verwenden find, können Sie -execdirParameter ausprobieren , z.
find . -type d -execdir realpath "{}" ';'
oder (gemäß @gniourf_gniourf Kommentar ):
find . -type d -execdir sh -c 'printf "%s/%s\n" "$PWD" "$0"' {} \;
Hinweis: Sie können ${0#./}anstelle von verwenden $0, um ./in der Front zu reparieren .
oder praktischeres Beispiel:
find . -name .git -type d -execdir git pull -v ';'
Wenn Sie das aktuelle Verzeichnis einschließen möchten, ist es noch einfacher, wenn Sie Folgendes verwenden -exec:
find . -type d -exec sh -c 'cd -P -- "{}" && pwd -P' \;
oder mit xargs:
find . -type d -print0 | xargs -0 -L1 sh -c 'cd "$0" && pwd && echo Do stuff'
Oder ein ähnliches Beispiel, das von @gniourf_gniourf vorgeschlagen wurde :
find . -type d -print0 | while IFS= read -r -d '' file; do
# ...
done
Die obigen Beispiele unterstützen Verzeichnisse mit Leerzeichen im Namen.
Oder durch Zuweisen in ein Bash-Array:
dirs=($(find . -type d))
for dir in "${dirs[@]}"; do
cd "$dir"
echo $PWD
done
Ändern Sie .Ihren spezifischen Ordnernamen. Wenn Sie nicht rekursiv ausgeführt werden müssen, können Sie dirs=(*)stattdessen Folgendes verwenden. Das obige Beispiel unterstützt keine Verzeichnisse mit Leerzeichen im Namen.
Wie @gniourf_gniourf vorgeschlagen hat, ist die einzig richtige Möglichkeit, die Ausgabe von find in ein Array zu setzen, ohne eine explizite Schleife zu verwenden, in Bash 4.4 verfügbar mit:
mapfile -t -d '' dirs < <(find . -type d -print0)
Oder kein empfohlener Weg (der das Parsen vonls beinhaltet ):
ls -d */ | awk '{print $NF}' | xargs -n1 sh -c 'cd $0 && pwd && echo Do stuff'
Das obige Beispiel würde das aktuelle Verzeichnis ignorieren (wie von OP angefordert), aber es wird bei Namen mit den Leerzeichen unterbrochen.
Siehe auch:
cd "$d"Dies wäre insofern besser, als es in Situationen übertragen wird, in denen der Platzhalter mit Dateien übereinstimmt, deren Namen Leerzeichen und / oder Shell-Metazeichen enthalten.