Riferimento tecnico · GNU/Linux
Rinominare i file dal terminale in modo sicuro
Un nome alla volta con mv, trasformazioni regolari con rename, logica esplicita con un ciclo: la scelta dipende dalla struttura del problema.
Prima regola: vedere il risultato
Una rinomina in massa è facile da descrivere e difficile da annullare se sostituisce un file esistente o genera due nomi uguali. Lavorare su una copia di prova o su un piccolo sottoinsieme permette di controllare spazi, accenti, estensioni e collisioni. Prima di ogni ciclo, stampare la coppia origine-destinazione senza eseguire mv.
for f in ./*.txt; do
nuovo=${f%.txt}.md
printf '%s -> %s\n' "$f" "$nuovo"
done
Le virgolette attorno alle variabili non sono decorazione: mantengono insieme nomi contenenti spazi e impediscono alla shell di reinterpretare caratteri speciali. Il prefisso ./ evita che un nome che comincia con un trattino venga letto come opzione. Se l’anteprima non è esatta, il ciclo non è pronto.
Spostare e rinominare con mv
mv cambia il nome o la posizione di un file. Per una singola operazione è lo strumento più trasparente. L’opzione interattiva chiede conferma prima di sovrascrivere, mentre -n evita la sovrascrittura. Scegliere il comportamento e non affidarsi a un alias che potrebbe non esistere in un’altra shell.
mv -i -- "rapporto vecchio.txt" "rapporto-2026.txt"
mv -n -- "bozza.txt" "finale.txt"
Dopo il comando, verificare il nome di destinazione e il contenuto. Per una serie piccola, più comandi espliciti possono essere preferibili a un’automazione sofisticata: sono facili da rileggere e da annotare.
Trasformazioni con rename
Il pacchetto Debian rename fornisce una rinomina basata su espressioni Perl. È adatto a sostituzioni regolari, ma la potenza della sintassi richiede un’anteprima. L’opzione -n mostra cosa verrebbe cambiato; solo dopo il controllo si rimuove l’opzione.
rename -n 's/ /_/g' -- ./*.jpg
rename -n 's/^foto-/viaggio-/' -- ./*.jpg
Un glob che non trova file può essere passato letteralmente, secondo le opzioni della shell. Prima di eseguire la trasformazione controllare la lista con printf o find. La raccolta delle pagine di manuale Debian aiuta a distinguere implementazioni e opzioni presenti nella release in uso.
Cicli con collisione esplicita
Quando il nuovo nome dipende da più condizioni, un ciclo leggibile è più sicuro di una sostituzione compatta. Il controllo -e impedisce di usare una destinazione già esistente. In caso di collisione il ciclo segnala il problema e continua senza scrivere.
for f in ./*.jpeg; do
[ -e "$f" ] || continue
base=${f##*/}
nuovo=./${base%.jpeg}.jpg
if [ -e "$nuovo" ]; then
printf 'Destinazione esistente: %s\n' "$nuovo" >&2
continue
fi
mv -- "$f" "$nuovo"
done
Per una trasformazione importante, sostituire inizialmente mv con printf. Conservare l’elenco delle coppie in un file fuori dalla directory permette di costruire una procedura inversa e di verificare a posteriori ciò che è successo.
Directory annidate e find -exec
find seleziona file in directory annidate senza spezzare i nomi sugli spazi. Per operazioni semplici, -exec passa ogni percorso come argomento distinto. Evitare di analizzare l’output di find con un ciclo che legge righe: un nome può contenere caratteri inattesi.
find ./documenti -type f -name '*.TXT' -exec sh -c '
for f do
nuovo=${f%.TXT}.txt
[ -e "$nuovo" ] || printf "%s -> %s\n" "$f" "$nuovo"
done
' sh {} +
La versione mostrata è ancora un’anteprima. Inserire mv -- "$f" "$nuovo" soltanto dopo aver controllato tutte le destinazioni. Per un archivio prezioso, una copia verificata rimane la protezione più semplice. Contare prima e dopo i file e confrontare un campione dei contenuti aiuta a scoprire omissioni, nomi duplicati o estensioni trasformate in modo inatteso. Il controllo deve riguardare il risultato reale, non soltanto l’assenza di un messaggio di errore. Registrare anche la directory di partenza evita ambiguità.