Rinominare più file

Da Linux User Group Scandiano.

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

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.