Trabajar con archivos cuyos nombres contienen espacios en bash

A partir de ahora voy a añadir entradas más sencillas pero que vienen muy bien a modo de recetas así que no será extraño ver entradas de una o dos líneas.

El problema
Muchas veces nos vemos con la necesidad de procesar una gran cantidad de archivos cuyos nombres contienen espacios.
Por desgracia el típico:

for i in `ls`; do echo $i; done

nos tomará como separador tanto un espacio como el retorno de carro.
De esta forma, si tenemos un fichero llamado mi foto.jpg, el resultado de lo anterior sería algo como:

mi
foto.jpg

por lo que no podremos usar esa salida para ejecutar un comando sobre una lista de archivos ... pues no funcionará bien.

La solución
Para que el while o el for de la bash sepan cual es separador nada mejor que decírselo:

jmferrerm@yinyan:~/Desktop/seleccion$ IFS="
> "
jmferrerm@yinyan:~/Desktop/seleccion$

Ejemplo
Quiero reducir la calidad a la mitad de un montón de fotos digitales para que me entren en una tarjeta de 128Mb que pueda meter en un marco digital.
Como la resolución del marco digital es mala tirando a peor no se va a notar esa bajada de calidad. ;-)


jmferrerm@yinyan:~/Desktop/seleccion$ IFS="
> "
jmferrerm@yinyan:~/Desktop/seleccion$ for i in `ls`; do convert $i -quality 50 `basename $i`.baja.jpg;done

Comentarios

Se agradece

Pero podías haber puesto un enlace a la charla que diste del gul.
No la encuentro por ningún lado.

otra opcion

Eso que dices funciona pero tambien es mas sencillo poner la variable entre comillas dobles.

Otra sugerencia para optimizar el codigo para iterar ficheros es no usar el ls ya que for i in *;do ls "$i";done hace lo mismo :-)

Trabajar con archivos cuyos nombres contienen espacios en bash

A partir de ahora voy a añadir entradas más sencillas pero que vienen muy bien a modo de recetas así que no será extraño ver entradas de una o dos líneas.

El problema
Muchas veces nos vemos con la necesidad de procesar una gran cantidad de archivos cuyos nombres contienen espacios.
Por desgracia el típico:

for i in `ls`; do echo $i; done

nos tomará como separador tanto un espacio como el retorno de carro.
De esta forma, si tenemos un fichero llamado mi foto.jpg, el resultado de lo anterior sería algo como:

mi
foto.jpg

por lo que no podremos usar esa salida para ejecutar un comando sobre una lista de archivos ... pues no funcionará bien.

La solución
Para que el while o el for de la bash sepan cual es separador nada mejor que decírselo:

jmferrerm@yinyan:~/Desktop/seleccion$ IFS="
> "
jmferrerm@yinyan:~/Desktop/seleccion$

Ejemplo
Quiero reducir la calidad a la mitad de un montón de fotos digitales para que me entren en una tarjeta de 128Mb que pueda meter en un marco digital.
Como la resolución del marco digital es mala tirando a peor no se va a notar esa bajada de calidad. ;-)


jmferrerm@yinyan:~/Desktop/seleccion$ IFS="
> "
jmferrerm@yinyan:~/Desktop/seleccion$ for i in `ls`; do convert $i -quality 50 `basename $i`.baja.jpg;done

Comentarios

Se agradece

Pero podías haber puesto un enlace a la charla que diste del gul.
No la encuentro por ningún lado.

otra opcion

Eso que dices funciona pero tambien es mas sencillo poner la variable entre comillas dobles.

Otra sugerencia para optimizar el codigo para iterar ficheros es no usar el ls ya que for i in *;do ls "$i";done hace lo mismo :-)