jueves, diciembre 15, 2011

Recorrer recursivamente una estructura de carpetas ejecutando comandos (unix/linux)

En ocasiones debemos aplicar la misma operación a un número de archivos, por ejemplo renombrarlos, moverlos o aplicarles un comando. Hay varias formas de hacer esto dependiendo de lo compleja que sea la operación que debemos aplicar y los parámetros que necesite pero, en general, es fundamental conocer el comando find.

El caso más sencillo es recorrer la estructura de carpeta ejecutando un comando que no necesita más parámetros que el nombre del archivo (por ejemplo para borrarlo)
find carpeta_objetivo/ -type f -name *.jpg -exec rm {} \;
Recorrería la estructura de directorios recursivamente  borrando todos los archivos con extensión '.jpg'. No hace falta decir que find tiene muchas opciones para modificar esos criterios de búsqueda.

El inconveniente del comando anterior es que no permite operaciones algo más complejas donde harían falta algunos parametros más como, por ejemplo. renombrar el archivo. Deberíamos recurrir entonces a un pequeño programa en bash para ejecutar operaciones. La ventaja es que lo podemos hacer en una sola línea:
for file in $(find OM_Translation/ -type f -name '*.properties'); do native2ascii $file $file.escaped; done
Recorre recursivamente  la estructura de directorios buscando archivos con la extensión .properties y ejecuta sobre ellos el comando native2ascii (un programa para convertir los caracteres como acentos en código ascci estándar: "Cámara" se convierte en "C\u00e1mara") guardando la salida en un archivo con el mismo nombre + la extensión .escaped.

En bash hay muchos alias definidos para el nombre del archivo ($file), el directorio... por ejemplo para renombrar archivos añadiendo el prefijo "thumb" podríamos hacer:
for file in $(find . -name '*.JPG'); do mv $file $(dirname $file)/thumb_$(basename $file); done

3 comentarios:

  1. awk - tratamiento de patrones , no tiene desperdicio.

    La mezcla bash - sed y awk es aplastante

    ResponderEliminar
  2. dice recorrer y explica un comando de busqueda

    ResponderEliminar
    Respuestas
    1. efectivamente, es un comando de búsqueda que aplicaca los ficheros encontrados a un programa

      Eliminar