Cómo cambiar el nombre de los archivos por lotes (imágenes) según el archivo CSV

11

Lo que tengo y quiero lograr:

  1. Hay miles de imágenes en una carpeta.

  2. Tengo un archivo CSV con las siguientes columnas:

    A: nombre original B: nombre renombrado

    Una fila típica se ve así:

    "original-1.jpg","renamed-1.jpg"  
    "original-2.jpg","renamed-2.jpg"

    Puedo eliminar las comillas, eso no es un problema.

  3. Ahora quiero usar una aplicación o ejecutar un script que buscará todas las imágenes en la columna A y les cambiará el nombre a nombres en la columna B (por ejemplo, original-1.jpg -> renamed-1.jpg).

Hay algunas respuestas, por ejemplo:

http://ubuntuforums.org/showthread.php?t=1069652

http://systembash.com/content/one-line-batch-rename-files-using-csv-input-file-and-awk/

Sin embargo, hay algunas secuencias de comandos involucradas y no estoy seguro de si todas esas secuencias de comandos afectan solo a la carpeta donde almacena la secuencia de comandos o pueden cambiar el nombre de todos los archivos en el disco que satisfacen ciertas condiciones. Por supuesto, esto último debe evitarse.

Lo que estoy buscando es una guía simple sobre cómo cambiar el nombre de los archivos y cómo elegir una carpeta con archivos.

Gracias de antemano.

tomar 2
fuente

Respuestas:

13

Esto debería funcionar para usted:

sed 's/"//g' files.csv | while IFS=, read orig new; do mv "$orig" "$new"; done 

Explicación:

  • sed 's/"//g' files.csv : eliminar las comillas
  • IFS=, : divide la entrada en ,
  • while read orig new; do ... done: Esto leerá cada línea de entrada, la dividirá en el valor de $IFS(aquí una coma) y guardará el primer campo como $origy el resto como $new.
  • mv "$orig" "$new" : esto cambiará el nombre de los archivos según lo solicitado.

Si su archivo solo contiene nombres de archivo (como orig.jpg) y ninguna ruta (no /home/take2/orig.jpgo similar), el comando anterior solo afectará a los archivos en su directorio actual. Por lo tanto, debe abrir un terminal cden el directorio de destino y ejecutarlo allí.

Prueba primero:

Para probar esto, puede hacer una ejecución en seco primero imprimiendo los comandos que se ejecutarán sin ejecutarlos realmente:

sed 's/"//g' files.csv | while IFS=, read orig new; do echo mv "$orig" "$new"; done 
terdon
fuente
Genial, esto se explica mejor. :) Solo para verificar antes de ejecutarlo: ¿tengo que cd al directorio de destino y ejecutar esta línea o necesito guardar esa línea como example.sh y luego ejecutar "example.sh" desde la terminal?
take2
@ take2 puede simplemente ejecutar la línea directamente. Actualicé la respuesta con una forma de ver qué se ejecutará sin cambiar realmente sus archivos, le recomiendo que lo haga primero.
terdon
¡Maravilloso, funciona! Solo una cosa más: ¿le importa cuáles son las etiquetas de las columnas (son "orig" y "nuevas" en este momento) o simplemente cambia el nombre de la columna A por el de la columna B?
take2
@ take2 qué etiquetas? No, solo toma el primer campo separado por comas y lo renombra al segundo. Tenga en cuenta que si hay más de dos campos, cambiará el nombre al resto de la línea. Siempre que su archivo de entrada sea como lo que publicó, funcionará como se esperaba.
terdon
Por cierto. El terminal también muestra "mv: no puede stat 'orig': No existe tal archivo o directorio", aunque cambió el nombre del archivo.
take2