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à.