lunes, febrero 14, 2011

iterar por directorios con espacios en un shell script

la vida nos sonríe, nos sentimos cual neo escribiendo comandos en el shell a diestra y siniestra, estamos a punto de para las balas con las manos, corremos:

for i in $(ls); do echo $i; done

y nuestra ilusión hacker se nos cae a pedazos al ver que cada palabra de un directorio o archivo con espacios sale en una linea nueva.

no desesperaos (?) he aquí la solución.

reproduzcamos el error para después arreglarlo:

$ mkdir -p "t/folder 1" "t/folder 2" "t/folder 3 with more spaces"
$ cd t
$ for i in $(ls); do echo $i; done
folder
1
folder
2
folder
3
with
more
spaces



vamos de nuevo ahora con la solución:

$ IFS="$(echo -e "\n\r")"
$ for i in $(ls); do echo $i; done
folder 1
folder 2
folder 3 with more spaces

y todos felices (incluso carlin calvo que puede seguir hackeando literalmente a dos manos en sus computadoras auspiciadas por fravega)

6 comentarios:

El Barto dijo...

Te tiro otra forma (creo que ni mejor ni peor, solo distinta):

ls -1 |while read i; do echo $i; done

Jeffry O'Nassto dijo...

for i in *; do echo $i; done

I WIN U FAIL

EMAG EHT

luismarianoguerra dijo...

@El Barto: alguna vez la habia usado, es mas facil de recordar que la mia

@nassto: no sabia esa (osea, si sabia que era valida, no sabia que funcionaba de otra forma)

Anónimo dijo...

esta gente que no lee la documentación... :-P

for i in "$(ls)"; do echo "$i"; done

et voilá!

Dra. Nada dijo...

ES UN LASER! SI CRUZO ME QUEMA!

Dra. Nada dijo...

OMG LAZURS

Seguidores

Archivo del Blog