Come rinominare in batch i file (immagini) in base al file CSV


11

Cosa ho e voglio ottenere:

  1. Ci sono migliaia di immagini in una cartella.

  2. Ho un file CSV con le seguenti colonne:

    A: nome originale B: nome rinominato

    Una riga tipica è simile alla seguente:

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

    Posso rimuovere le virgolette, non è un problema.

  3. Ora voglio usare un'app o eseguire uno script che cercherà tutte le immagini nella colonna A e le rinominerà con i nomi nella colonna B (es. Original-1.jpg -> renamed-1.jpg).

Ci sono alcune risposte in giro, ad esempio:

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

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

Tuttavia, ci sono alcuni script coinvolti e non sono sicuro se tutti quegli script influenzano solo la cartella in cui si memorizza lo script o possono rinominare tutti i file sul disco che soddisfano determinate condizioni. Naturalmente, quest'ultimo deve essere evitato.

Quello che sto cercando è una semplice guida su come rinominare i file e come scegliere una cartella con i file.

Grazie in anticipo.

Risposte:


13

Questo dovrebbe funzionare per te:

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

Spiegazione:

  • sed 's/"//g' files.csv : rimuove le virgolette
  • IFS=, : divide l'ingresso ,
  • while read orig new; do ... done: Questo leggerà ogni riga di input, la dividerà sul valore di $IFS(qui una virgola) e salverà il 1 ° campo come $orige il resto come $new.
  • mv "$orig" "$new" : questo rinominerà i file come richiesto.

Se il tuo file contiene solo nomi di file (come orig.jpg) e nessun percorso (non /home/take2/orig.jpgo simile), il comando sopra avrà effetto solo sui file nella tua directory corrente. Quindi, è necessario aprire un terminale, cdnella directory di destinazione ed eseguirlo lì.

Prima prova:

Per verificarlo, puoi prima eseguire una prova a secco stampando i comandi che verranno eseguiti senza eseguirli effettivamente:

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

Ottimo, questo è spiegato meglio. :) Solo per verificare prima di eseguirlo - Devo eseguire il cd nella directory di destinazione ed eseguire questa riga o devo salvare quella riga come esempio.sh e quindi eseguire "esempio.sh" dal terminale?
prendere il

@ take2 puoi semplicemente eseguire la linea direttamente. Ho aggiornato la risposta con un modo per vedere cosa verrà eseguito senza effettivamente modificare i tuoi file, ti consiglio di farlo prima.
terdon,

Meraviglioso, funziona! Ancora un'altra cosa: importa quali sono le etichette delle colonne (al momento sono "orig" e "nuove") o rinomina solo i nomi della colonna A in quelli della colonna B?
Take2,

@ take2 quali etichette? No, prende solo il primo campo separato da virgola e lo rinomina nel secondo. Nota che se ci sono più di due campi, lo rinominerà nel resto della riga. Finché il file di input è simile a quello che hai pubblicato funzionerà come previsto.
terdon,

Btw. Il terminale visualizza anche "mv: impossibile stat 'orig': nessun file o directory", sebbene abbia rinominato il file.
prendere il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.