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

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
Allegato | Dimensione |
---|---|
my_rinomina_jpg.txt | 1.19 KB |
Commenti
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:
sarebbe bastato il seguente comando:
Per la sintassi del comando: man rename.
Ciao
Pietro
Debian. Be unique.
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
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).
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):
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
diventa:
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.
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
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...
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
Inviato da mcortese il Mer, 28/10/2015 - 00:14.
Re: Rinominare i file da terminale
Se non hai rename, devi simularlo così:
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 senzaecho
. Esempio (non darlo se non sei sicuro di aver capito):Inviato da ttronko il Mer, 28/10/2015 - 11:02.
Re: Rinominare i file da terminale
La seconda stringa funziona,
GRAZIE MILLE!
OTTIMO!
IT WORKS!
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...
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
.