Rinominare un elevato numero di files potrebbe essere un’operazione lunga e noiosa se effettuata con il normale file manager grafico. In alcuni casi è possibile servirsi del terminale creando un piccolo script in grado di effettuare l’operazione ciclicamente su tutti i files.
Supponiamo di avere la seguente lista di files alla quale si vuole aggiungere un suffisso.
max@silvermoon:~/foto$ ls george.jpg john.jpg paul.jpg ringo.jpg
Per rinominarli è possibile utilizzare questa serie concatenata di comandi. Il punto e virgola può essere sostituito con un invio, Il ciclo verrà eseguito solo successivamente al comando done.
$ for i in `ls *.jpg`; do mv $i beatles_$i;done
Il risultato del comando è il seguente:
maxo@silvermoon:~/foto$ ls beatles_george.jpg beatles_john.jpg beatles_paul.jpg beatles_ringo.jpg
Il ciclo descritto sopra può essere particolarmente pericoloso poichè un eventuale errore potrebbe riperquotersi su tutti i files selezionati dal comando ls. Per questo motivo è una buona abitudine, prima di lanciare il comando in esecunzione, lanciarlo in stampa servendosi del comando echo. Il comando visto in precedenza sarà il seguente:
$ for i in `ls *.jpg`; do echo mv $i beatles_$i;done
e produrrà questo output:
mv george.jpg beatles_george.jpg mv john.jpg beatles_john.jpg mv paul.jpg beatles_paul.jpg mv ringo.jpg beatles_ringo.jpg
Indice
Rinominare più file da minuscolo a maiuscolo e viceversa
per rinominare i file da minuscolo a maiuscolo spostarsi nella cartella contente i file da rinominare e lanciare questo comando:
for i in *; do mv $i $(echo $i | tr [:lower:] [:upper:]); done
per rinominare i file da maiuscolo a minuscolo spostarsi nella cartella contente i file da rinominare e lanciare questo comando:
for i in *; do mv $i $(echo $i | tr [:upper:] [:lower:]); done
Cambiare l’estensione
E’ possibile cambiare l’estensione ad un file inviado l’output del comando al tool sed. Supponiamo di voler cambiare l’estensione dei file seguenti da .jpg a .jpeg.
ls 1.jpg 2.jpg 3.jpg 4.jpg
Ecco come utilizzare sed per cambiare l’estensione:
for i in `ls`; do mv $i `echo $i | sed s/jpg/jpeg/g`;done
Il risultato sarà il seguente:
ls 1.jpeg 2.jpeg 3.jpeg 4.jpeg
Rinominare in modo veloce
Se vogliamo rinominare tutti i files contenuti all’interno di una cartella (ad esempio per sostituire uno spazio con un trattino basso) è possibile usare il seguente comando.
ls -1 | rename 's/\ /_/g'
nota: per far sì che il comando accetti lo spazio come carattere standard è necessario anteporre il carattere “\”. Se avessimo voluto sostituire un “.” con un “_” bastava scrivere “s/./_/g”
Aggiungere un prefisso a più file
Con questo comando aggiungiamo “prefisso_” a tutti i file e cartelle contenuti nella posizione in cui ci troviamo (non ricorsivo).
for filename in * ; do mv $filename prefisso_$filename; done
Ad esempio si potrebbe sostituire “*” con “*.txt* per manipolare solo i file con estensione txt.
Aggiungere un prefisso a più file ricorsivamente
Con questo script aggiungiamo “prefisso_” a tutti i file *.avi ricorsivamente dalla cartella in cui lo lanciamo:
#!/bin/bash inputdir=$1 echo Sto cercando i file for file in $(find $inputdir -iname "*.avi") do name=$(basename $file .avi) ; directory=$(dirname $file); echo rinomino il file $file mv $file $directory/prefisso_$name.avi done
ad esempio se il nostro script si chiama aggiunta_prefisso e vogliamo modificare il nome dei file presenti in /tmp scriveremo:
aggiunta_prefisso /tmp
Altro modo per rinominare
lista=`find -name "*.PDF"`; for i in $lista; do j=`echo $i | sed -e 's:PDF:pdf:g'` ; mv $i $j ; done
In questo modo cambiamo le estensioni dei file .PDF da maiuscolo a minuscolo.