Comando mv in Linux: spostare e rinominare file senza confondere i percorsi
mv sposta file e directory oppure ne cambia il nome. Nello stesso filesystem normalmente rinomina il percorso; tra filesystem diversi GNU mv può copiare i dati e poi rimuovere la sorgente, quindi occorre controllare destinazione, sovrascritture e possibili risultati parziali.
Gli esempi si riferiscono a GNU Coreutils. Controlla mv --help e man mv sul sistema di destinazione: opzioni come -T, -t, --no-copy e le varianti di --update non sono disponibili in tutte le versioni o implementazioni.
Cos'è il comando mv?
Con due argomenti, se la destinazione è una directory esistente, mv sposta la sorgente al suo interno conservandone il nome. Se la destinazione è un nuovo percorso, questo diventa il nome della sorgente. Lo spostamento non lascia normalmente una seconda copia nel percorso iniziale. Se il filesystem cambia, GNU ricorre a una copia simile a cp -a e rimuove la sorgente dopo il successo della copia: non è un’unica rinomina atomica fra due supporti.
Sintassi di base
mv [OPTION]... [-T] SOURCE DESTINATION
mv [OPTION]... SOURCE... DIRECTORY
mv [OPTION]... -t DIRECTORY SOURCE...
Racchiudi tra virgolette i percorsi con spazi. Con GNU mv -- -bozza finale, -- termina le opzioni e permette di usare un nome che inizia con un trattino. La sintassi precedente è uno schema con segnaposto, non un comando da copiare letteralmente.
Uso base di mv
Rinominare un file
Prepara una cartella nuova con mkdir mv-demo && cd mv-demo; se il nome esiste già, scegline un altro. Crea il file di prova con printf "bozza\n" > draft.txt, lasciando assente final.txt. Dopo il comando, il contenuto è in final.txt e draft.txt non esiste più.
mv draft.txt final.txt
Spostare un file in una directory
Crea una directory vuota con mkdir archive e un file di prova chiamato report.pdf. La directory di destinazione esiste già: il risultato è archive/report.pdf, con lo stesso nome del file originale. Il percorso report.pdf nella cartella corrente scompare.
mv report.pdf archive/
Spostare più file
Crea old-logs e tre file di prova app.log, access.log ed error.log. Le due righe seguenti sono alternative: esegui solo la prima oppure solo la seconda. Dopo la prima, i tre nomi non si trovano più nella cartella corrente; per provare la seconda devi prima ricreare i file di prova. *.log è espanso dalla shell e normalmente non include nomi nascosti. Se non corrisponde a nulla, Bash può passare il pattern letterale e mv segnala un errore. Con più sorgenti, la destinazione deve essere una directory esistente.
mv *.log old-logs/
mv -t old-logs app.log access.log error.log
Verificare lo spostamento o la rinomina
Senza -v, uno spostamento riuscito normalmente non produce messaggi. La prova seguente crea una sottocartella nuova e si interrompe se la preparazione o il comando fallisce. Le parentesi mantengono invariata la directory della shell principale.
(
mkdir move-check || exit 1
cd move-check || exit 1
printf 'demo\n' > before.txt
mv before.txt after.txt || exit 1
test -f after.txt && test ! -e before.txt
echo $?
)
L’output atteso è 0: test -f after.txt && test ! -e before.txt ha verificato sia la presenza del nuovo file sia l’assenza del vecchio percorso. È il risultato dei test, non il codice originale di mv. Verifica anche il contenuto: il solo cambio di nome non dimostra che un trasferimento fra filesystem sia completo o che tutti gli attributi siano conservati.
Opzioni principali
| Opzione | Scopo |
|---|---|
-i |
Chiede conferma prima di sostituire una destinazione esistente. |
-n |
Evita la sostituzione dei file esistenti. GNU 9.12 la indica come deprecata; verifica il codice di uscita della versione installata e le alternative --update. |
-f |
Non chiede conferma prima della sostituzione. Non aggira permessi, errori del filesystem o incompatibilità fra tipi di file. |
-u |
Salta un file non directory quando la destinazione ha un tempo di modifica uguale o più recente. Non confronta i dati. |
-v |
Mostra i percorsi elaborati. |
-b |
Conserva una copia della destinazione preesistente prima di sostituirla; il suffisso predefinito è normalmente ~, ma può essere configurato. |
-T |
Usa la destinazione come percorso esatto, senza aggiungervi il nome della sorgente. Non permette di fondere directory non vuote. |
-t DIR |
Indica una directory contenitore esistente prima dell’elenco delle sorgenti. |
Le opzioni lunghe rendono spesso più chiari gli script GNU. Per la portabilità confronta mv in POSIX.1-2024, che specifica -i e -f. In GNU, fra -i, -f e -n prevale l’ultima opzione indicata.
Esempi pratici
Confermare la sostituzione o conservarne un backup
-i è utile per la scelta interattiva; -n conserva i file di destinazione ma può anche lasciare la sorgente al suo posto. GNU 9.12 depreca -n: nelle versioni che le supportano, --update=none salta i file esistenti senza errore e --update=none-fail li salta con diagnostica ed esito di errore. Con -b puoi conservare la destinazione precedente. Le due righe sotto sono alternative su un percorso di sistema: adattale prima dell’uso e non eseguirle nel laboratorio. Dopo uno spostamento riuscito new.conf non esiste più; per ripetere la prova serve una nuova sorgente. Se scegli -b, controlla anche la copia con suffisso di backup.
mv -iv new.conf /etc/myapp/config.conf
mv -bv new.conf /etc/myapp/config.conf
Rendere la destinazione univoca
Prepara staging come directory di prova con un file e lascia assente current. La prima riga la rinomina in current, senza creare current/staging. Una directory current già esistente e non vuota non viene fusa: il comando fallisce. Per la seconda riga usa la directory archive preparata in precedenza e due nuovi file di prova file1 e file2; i risultati saranno archive/file1 e archive/file2.
mv -T staging current
mv -t archive -- file1 file2
Pianificare uno spostamento fra filesystem
Il primo comando richiede due directory già esistenti: mostra i filesystem e lo spazio disponibile per ciascun percorso. Non basta che i nomi o i punti di montaggio siano diversi per concludere che i filesystem siano distinti. La seconda riga è un esempio da adattare: controlla prima che /mnt/archive sia il volume previsto, sia montato e abbia spazio sufficiente; non eseguirla nel laboratorio. Lo spostamento può durare quanto una copia e richiede accesso in lettura ai dati. Se devi conservare l’originale finché la verifica non è conclusa, usa prima una copia con cp, confronta dati e attributi e pianifica separatamente la rimozione. Dove disponibile, --no-copy fa fallire GNU mv invece di ripiegare sulla copia quando la rinomina fra filesystem non è possibile; verifica il supporto con mv --help.
df -h source-dir destination-dir
mv -v large-image.raw /mnt/archive/
mv e comandi correlati
| Comando o metodo | Ruolo principale | Quando usarlo |
|---|---|---|
mv |
Sposta o rinomina | Quando il percorso originale non deve restare disponibile |
cp |
Creare una copia separata | Sia la sorgente che la copia devono rimanere |
rename |
Rinominare più elementi secondo una regola | Modifiche in serie dopo aver verificato quale programma rename è installato |
rsync --remove-source-files |
Trasferire i file e rimuovere quelli sorgente trasferiti con successo | Trasferimenti locali o remoti controllati; le directory sorgente non vengono rimosse da questa opzione |
Avvertenze importanti
Uno spostamento non passa dal cestino
Sostituire un file può distruggere il contenuto precedente senza creare una voce nel cestino del desktop. Verifica la destinazione e usa conferma, mancata sovrascrittura o backup quando necessario. Per invertire una semplice rinomina, accertati che il vecchio nome sia libero e sposta il file indietro; questo non recupera un file di destinazione già sovrascritto.
Una lista di spostamenti può riuscire solo in parte
Se un elemento successivo fallisce, quelli precedenti possono essere già stati spostati. Dopo un errore controlla sorgenti, destinazioni, messaggi e contenuto; non rilanciare automaticamente l’intera lista presumendo lo stato iniziale. Tra filesystem, la conservazione di liste di controllo degli accessi (ACL), attributi estesi (xattr), contesti di sicurezza e proprietario dipende dai privilegi e dai filesystem coinvolti. Per il confronto con rsync --remove-source-files, il manuale ufficiale di rsync richiede sorgenti non più in scrittura: l’opzione rimuove i file trasferiti con successo, non le directory.
Evitare la barra finale su un link simbolico a directory
Un link simbolico contiene il percorso di un altro elemento. Per spostare il link stesso, indica il suo nome senza barra finale. Il comportamento di un link a directory seguito da / dipende dal sistema: non dedurre che verrà spostato il link. Controlla anche se la directory di destinazione è a sua volta un link verso un altro percorso.
FAQ
mv ricopia i dati nello stesso filesystem?
Normalmente esegue una rinomina, senza ricopiare tutto il contenuto. Fra filesystem differenti GNU può dover copiare e poi rimuovere la sorgente: durata e possibili errori sono diversi.
Come evito di sovrascrivere una destinazione?
Puoi usare -n, ma controlla il comportamento della versione installata: GNU 9.12 la depreca e propone le varianti --update. Se disponibili, --update=none salta i file esistenti senza errore e --update=none-fail segnala il mancato spostamento. Per una scelta interattiva usa -i e verifica quali sorgenti sono rimaste.
Rinominare e spostare sono comandi diversi?
Entrambi usano mv sorgente destinazione. Un nuovo nome nella stessa directory è una rinomina; una directory di destinazione esistente diventa invece il contenitore del file.
Come posso spostare chiaramente molti file in una directory?
Con GNU usa mv -t archivio -- file1 file2, dopo aver creato archivio e verificato i file. La destinazione è esplicita, ma ciò non impedisce sovrascritture o errori parziali: scegli anche la politica di sostituzione.




