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...)
¿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.