
Necesito recorrer cada archivo dentro de un directorio. Una forma común que vi fue usar el bucle for que comienza con for file in *; do
. Sin embargo, me di cuenta de que no incluye archivos ocultos (archivos que comienzan con "."). La otra forma obvia es hacer algo como
for file in `ls -a`; do
Sin embargo, iterar ls
es una mala idea porque los espacios en los nombres de los archivos estropean todo. ¿Cuál sería la forma correcta de recorrer un directorio y también obtener todos los archivos ocultos?
Respuesta1
Sólo necesita crear una lista de archivos globales coincidentes, separados por espacios:
for file in .* *; do echo "$file"; done
Editar
Lo anterior se puede reescribir en una forma diferente usando expansión de llaves.
for file in {.*,*}; do echo "$file"; done
o incluso más corto:for file in {.,}*; do echo "$file"; done
Agregar la ruta para los archivos seleccionados:
for file in /path/{..?,.[!.],}*; do echo "$file"; done
Agregar ruta para archivos seleccionados:
for file in /path/{.,}*; do echo "$file"; done
Si desea ser sofisticado y eliminar de la lista los que normalmente son innecesarios .
y ..
simplemente cambiar {.,}*
a {..?,.[!.],}*
.
Para completar, vale la pena mencionar que también se puede configurar dotglob para que coincida con archivos de puntos con archivos *
.
shopt -s dotglob
En zsh
uno es necesario configurar adicionalmente nullglob
para evitar el error en caso de que no haya coincidencias:
setopt nullglob
o, alternativamente, agregue un calificador global N
al patrón:
for file in /path/{.,}*(N); do echo "$file"; done