Bucles "for" en bash con ficheros con espacios

Supongo que muchos conoceréis este truquillo, pero a mi me costó lo suyo encontrarlo en su momento...

¿Alguna vez habéis hecho un bucle "for" en bash para recorrer una serie de ficheros y realizar tareas sobre ellos? Si es así, cuando los nombres de ficheros contienen espacios, "for" parte el nombre del fichero en varios trozos:

luis@endymion:~/pruebas$ ls
fichero con espacios 1  fichero con espacios 2  fichero-sinespacios1  fichero-sinespacios2
luis@endymion:~/pruebas$ for i in $(ls *); do echo $i; done
fichero
con
espacios
1
fichero
con
espacios
2
fichero-sinespacios1
fichero-sinespacios2
luis@endymion:~/pruebas$

Para ajustar qué carácter es usado por bash como delimitador de campos, exista la variable IFS. Por defecto, considera un delimitador al salto de línea, retorno de carro, espacio y tabulado. Si lo ajustamos quitando el espacio y el tabulado, eliminamos el problema con los nombres de fichero:

luis@endymion:~/pruebas$ ls
fichero con espacios 1  fichero con espacios 2  fichero-sinespacios1  fichero-sinespacios2
luis@endymion:~/pruebas$ IFS=$'\x0A'$'\x0D'; for i in $(ls *); do echo $i; done
fichero con espacios 1
fichero con espacios 2
fichero-sinespacios1
fichero-sinespacios2
luis@endymion:~/pruebas$

Espero que a alguien le sirva de ayuda! (Como todo el mundo me diga que ya lo sabía, me hundís en la miseria...)

Comentarios

Anónimo:

Muchas gracias.
Fue de gran ayuda la variable IFS. Ahora mucho dolores de cabeza.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.