Wenn Sie GNU verwenden find
, können Sie -execdir
Parameter 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.