Si está utilizando GNU find
, puede probar el -execdir
parámetro, por ejemplo:
find . -type d -execdir realpath "{}" ';'
o (según el comentario de @gniourf_gniourf ):
find . -type d -execdir sh -c 'printf "%s/%s\n" "$PWD" "$0"' {} \;
Nota: Puede usar en ${0#./}
lugar de $0
arreglar ./
en el frente.
o un ejemplo más práctico:
find . -name .git -type d -execdir git pull -v ';'
Si desea incluir el directorio actual, es aún más simple usando -exec
:
find . -type d -exec sh -c 'cd -P -- "{}" && pwd -P' \;
o usando xargs
:
find . -type d -print0 | xargs -0 -L1 sh -c 'cd "$0" && pwd && echo Do stuff'
O ejemplo similar sugerido por @gniourf_gniourf :
find . -type d -print0 | while IFS= read -r -d '' file; do
# ...
done
Los ejemplos anteriores admiten directorios con espacios en su nombre.
O asignando a bash array:
dirs=($(find . -type d))
for dir in "${dirs[@]}"; do
cd "$dir"
echo $PWD
done
Cambie .
a su nombre de carpeta específico. Si no necesita ejecutar recursivamente, puede usar: en su dirs=(*)
lugar. El ejemplo anterior no admite directorios con espacios en el nombre.
Entonces, como sugirió @gniourf_gniourf , la única forma adecuada de colocar la salida de find en una matriz sin usar un bucle explícito estará disponible en Bash 4.4 con:
mapfile -t -d '' dirs < <(find . -type d -print0)
O no es una forma recomendada (que implica el análisis dels
):
ls -d */ | awk '{print $NF}' | xargs -n1 sh -c 'cd $0 && pwd && echo Do stuff'
El ejemplo anterior ignoraría el directorio actual (según lo solicitado por OP), pero se romperá en los nombres con los espacios.
Ver también:
cd "$d"
sería mejor ya que se transfiere a situaciones en las que el comodín coincide con los archivos cuyos nombres contienen espacios en blanco y / o metacaracteres de shell.