Rinominare i file da terminale

Gio, 03/11/2011 - 11:56

Rinominare i file da terminale

Inviato da marcosan 10 commenti

Rinominare un file e` un'operazione piuttosto comune e tutto sommato farlo con un qualsiasi manager grafico e` abbastanza intuitivo e veloce. Anche il comando che dovremmo utilizzare dalla linea di comando e` molto semplice (mv file_originale file_rinominato), ma nonostante sia personalmente contrario all'utilizzo di un manager grafico per i file (proprio non mi piacciono) devo dire che la velocita` nell'eseguire una singola operazione e` praticamente la stessa...e probabilmente per chi si affaccia da poco in ambiente *nix ed e` abituato ad utilizzare gli spazi nei nomi dei file, l'uso della riga di comando potrebbe essere un bel ginepraio! Ma non e` della sintassi del comando mv che voglio parlare...

Pensiamo ora di voler rinominare un elevato numero di files, ad esempio le foto che quella stupida macchina fotografica si ostina a chiamare "DSCNxxxx.jpg" (con varie combinazioni di maiuscolo/minuscolo decisamente antiestetiche per i miei gusti!). Magari dopo averle separate per bene in diversi raccoglitori (directory) ed averli etichettati (nominati) "sardegna_2011", "roma_2011", etc., vorresti che le foto avessero i nomi "sardegna_2011-xxxx.jpg" (xxxx e` ovviamente il numero che identifica le varie fotografie).

Bene, armato di buona volonta` potresti anche intraprendere il lungo viaggio, rinominandoli uno ad uno, ma se la tua pazienza e` paragonabile alla mia...non credo arriveresti mai alla fine del primo catalogo (directory)!

Lo scopo di questa breve guida (o "Coma faccio a" come la chiamerebbe uno che di computer ne capisce davvero) e` quello di sfruttare la linea di comando e la sua capacita` di eseguire un elenco di istruzioni per semplificarci la vita e permetterci di fare qualcosa di piu` divertente!

Le Basi

Supponiamo avere i seguenti file

$ ls
a.txt  b.txt  c.txt  d.txt

possiamo facilmente modificare i nomi dei file come segue
$ for i in *.txt; do mv "$i" nuovi_"$i"; done

ed il risultato che otterremmo sarebbe
$ ls
nuovi_a.txt  nuovi_b.txt  nuovi_c.txt  nuovi_d.txt

ATTENZIONE: durante la fase di preparazione di uno script, anzitutto sarebbe buona cosa testare lo stesso PRIMA dell'utilizzo in una cartella destinata alle nostre prove, pena la perdita di qualche documento prezioso a causa di qualche subdolo errore! Un altro accorgimento puo` essere quello di simulare le azioni che verranno fatte, utilizzando il comando echo:

$ for i in *.txt; do echo mv "$i" nuovi_"$i"; done

che ci permettera` di leggere direttamente sullo schermo quel che sarebbe accaduto
mv a.txt nuovi_a.txt
mv b.txt nuovi_b.txt
mv c.txt nuovi_c.txt
mv d.txt nuovi_d.txt

Maiuscole e minuscole

Per rinominare tutti file contenuti nella cartella convertendo le lettere minuscole nelle rispettive lettere maiuscole e` sufficiente utilizzare il comando

$ for i in *; do mv "$i" $(echo "$i" | tr [:lower:] [:upper:]); done

per l'operazione contraria lascio spazio alla tua fantasia Wink

Modifichiamo l'estensione

E` anche possibile cambiare facilmente l'estensione ad un file utilizzando il comando sed. Per cambiare l'estensione dei file da .jpeg a .jpg basta usare il comando

$ for i in *.jpeg; do mv "$i" `echo "$i" | sed s/jpeg/jpg/g`; done

Aggiungiamo un prefisso

Per aggiungere il prefisso pre_ a tutti i file con estensione .jpg possiamo scrivere

for i in *.jpg; do mv "$i" pre_"$i"; done

Un esempio (utile?)

Naturalmente le combinazioni che la fantasia puo` suggerirti sono infinite o quasi, e anche i comandi a tua disposizione sono tantissimi...non ti resta che leggere le pagine del manuale relative ai vari comando per imparare a sfruttare appieno la potenza della riga di comando! Per il momento questa breve guida finisce qui, ma non prima di svelarti quel che probabilmente hai gia` capito come fare da solo: rinominare quelle dannate fotografie!

Ecco lo script

#!/bin/bash
 
# Script per rinominare tutti i file con estensioni jpg/jpeg/JPG/JPEG
# presenti nel direttorio dove viene eseguito lo stesso.  I file
# vengono rinominati nella forma <nome_base>-xxxx.jpg, dove il
# <nome_base> deve essere passato come argomento da riga di comando e
# xxxx e` un numero che fa da contatore.
#
# UTILIZZO: my_rinomina_jpg <nome_base>
#
# Autore: Marco Sansottera
# Data:   03.11.2011
# Versione: 0.1
 
if [ $# -ne 1 ] ; then
    echo "$0: Errore, mi serve un argomento come \"nome base\" da utilizzare!"
    exit 1
fi
 
for file in *.jpeg; do 
    [ -f "$file" ] || continue;
    mv "$file" `echo "$file" | sed s/jpeg/jpg/g`; 
done
 
for file in *.JPG; do
    [ -f "$file" ] || continue;
    mv "$file" `echo "$file" | sed s/JPG/jpg/g`; 
done
 
for file in *.JPEG; do 
    [ -f "$file" ] || continue;
    mv "$file" `echo "$file" | sed s/JPEG/jpg/g`; 
done
 
for file in *.jpg; do 
    [ -f "$file" ] || continue;
    newfile=`echo "$file"  | tr [:upper:] [:lower:]`;
    if [ "$newfile" != "$file" ]; then
	mv "$file" "$newfile";
    fi
done
 
i=1;
 
for file in *.jpg;  do
    [ -f "$file" ] || continue;
    output="$1"-`printf "%04d\n" $i`.jpg;
    mv "$file" "$output";
    i=$((i+1));
done

AllegatoDimensione
my_rinomina_jpg.txt1.19 KB




Commenti

Ritratto di pietro
#1

Inviato da pietro il Ven, 04/11/2011 - 08:52.

Re: Rinominare i file da terminale

Per rinominare tanti file insieme c'e' gia' un comando molto comodo chiamato "rename".

Ad esempio, per rinominare i file da maiuscolo a minuscolo, al posto del ciclo:

for file in *.jpg; do 
    [ -f "$file" ] || continue;
    newfile=`echo "$file"  | tr [:upper:] [:lower:]`;
    if [ "$newfile" != "$file" ]; then
	mv "$file" "$newfile";
    fi
done

sarebbe bastato il seguente comando:

rename 'y/A-Z/a-z/' *

Per la sintassi del comando: man rename.

Ciao
Pietro

Debian. Be unique.



Ritratto di marcosan
#2

Inviato da marcosan il Ven, 04/11/2011 - 14:53.

Re: Rinominare i file da terminale

Ciao Pietro, lo so che il comando rename potrebbe essere piu' comodo, ma ho preferito limitarmi ai comandi Bash Wink

Comunque si, potrei integrare alcune varianti...diciamo che nasce tutto prorpio dalla mia esigenza di rinominare molte foto!

Ciao,
Marco

"La matematica e' l'arte di dare lo stesso nome a cose diverse."
H.Poincare (1854-1912).



Ritratto di pietro
#3

Inviato da pietro il Ven, 04/11/2011 - 15:30.

Re: Rinominare i file da terminale

Anch'io uso il comando rename principalmente per le foto, ed ho trovato anche molto utile l'utilizzo delle informazioni EXIF per rinominare i file anteponendo una data.

Di solito uso questo comando (all'interno di uno script):

$ exiv2 mv -r "%Y-%m-%d-${name}:basename:" $FILEPATTERN

dove $name e' un nome che identifica l'argomento (es. mare, natale, pasqua, ecc.) e $FILEPATTERN e' il pattern delle foto; per la mia macchina FILEPATTERN="[p]*.jpg", serve per evitare di rinominare foto gia' rinominate.

Il risultato e' il seguente: la foto

p1040770.jpg

diventa:

2011-08-29-Estate-p1040770.jpg

usando name="Estate". In questa maniera metto in maniera automatica la data nel mome delle foto, prendendola dalle informazioni EXIF memorizzate nel file JPEG. Si potrebbe anche eliminare il nome del file originale lasciando solo la data, ma mantenendolo posso sempre capire a quale file si riferisce sulla scheda SD.

Prerequisito: il pacchetto exiv2.

Ciao
Pietro

Debian. Be unique.



Ritratto di ttronko
#4

Inviato da ttronko il Mar, 27/10/2015 - 10:23.

Re: Rinominare i file da terminale

Ciao
cercavo il comando per eliminare solo la parola "copia" da una lista di file, mantenendo tutto il resto del nome invariato,
grazie



Ritratto di mcortese
#5

Inviato da mcortese il Mar, 27/10/2015 - 15:51.

Re: Rinominare i file da terminale

Usando il rename di util-linux (di solito installato come rename.ul):
rename "copia" "" LISTA_DI_FILE...

Usando il rename di Perl (di solito installato come rename):
rename s/copia// LISTA_DI_FILE...



Ritratto di ttronko
#6

Inviato da ttronko il Mar, 27/10/2015 - 17:54.

Re: Rinominare i file da terminale

niente da fare Terminal di Mac non riconosce il comando rename Sad



Ritratto di mcortese
#7

Inviato da mcortese il Mer, 28/10/2015 - 00:14.

Re: Rinominare i file da terminale

Se non hai rename, devi simularlo così:

for x in LISTA_FILE; do echo mv "$x" "${x/copia/}"; done

Nota che ho messo echo perché così ti stampa a video cosa vorrebbe fare invece che farlo. Se il risultato ti sembra corretto, ripeti il comando senza echo. Esempio (non darlo se non sei sicuro di aver capito):
for x in *.jpg; do mv "$x" "${x/copia/}"; done



Ritratto di ttronko
#8

Inviato da ttronko il Mer, 28/10/2015 - 11:02.

Re: Rinominare i file da terminale

La seconda stringa funziona,
OTTIMO!
IT WORKS!
Smile GRAZIE MILLE!



Ritratto di ttronko
#9

Inviato da ttronko il Mer, 11/11/2015 - 16:00.

Re: Rinominare i file da terminale con i .tif

Ciao
ho provato a togliere la parola _DETTAGLIO dal nome di una serie di file, questa volta .tif con questa stringa da terminale mac:

for x in *.tif; do mv "$x" “${x/ _DETTAGLIO/}”; done

non va... Sad



Ritratto di mcortese
#10

Inviato da mcortese il Gio, 12/11/2015 - 01:18.

Re: Rinominare i file da terminale con i .tif

Sembra che ci sia un spazio prima di _DETTAGLIO.