forma adecuada de iterar a través del contenido de un directorio

forma adecuada de iterar a través del contenido de un directorio

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 lses 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 zshuno es necesario configurar adicionalmente nullglobpara evitar el error en caso de que no haya coincidencias:

setopt nullglob

o, alternativamente, agregue un calificador global Nal patrón:

for file in /path/{.,}*(N); do echo "$file"; done

información relacionada