Risposte:
Se si sposta una directory sullo stesso file system, si sposta solo la voce della directory da una posizione nel file system a un'altra. Ad esempio, mv /source/dir /target/dir
eliminerà la voce della directory di dir
da /source
e ne creerà una nuova in /target
. Questo è fatto da una chiamata al sistema atomico (cioè, ininterrotta). L'inode contenente le voci della directory dir
e il contenuto effettivo della directory stessa non sono interessati.
Se si sposta la directory da un file system a un altro, tutti i file vengono prima copiati nel nuovo file system e quindi scollegati da quello originale. Quindi, se interrompi mv
durante la copia, potresti finire con due copie di alcuni file: nella posizione precedente e in quella nuova.
strace mv /fs1/dir /fs2/
: l' ultima cosa che mv fa è chiamare contemporaneamente unlinkat
tutti i file sorgente (non uno per uno mentre vengono copiati).
L'implementazione GNU scorre gli argomenti sulla riga di comando, tenta prima di rinominare e, in caso contrario, copia ricorsivamente e quindi elimina ricorsivamente l'origine. Così
mv a b c/
cancellerà a prima di copiare b e non inizierà a cancellare nulla in a prima che la copia di destinazione sia completata.
Si noti che questo vale solo per l'implementazione GNU.
Per chiarire: se una è una directory contenente d ed e , e b è un file, l'ordine sarà
mv
, quindi non è solo GNU.
Sposta una directory, interrompi lo spostamento e la directory originale rimarrà intatta:
$ mv a b/
Se sposti più directory, ognuna sarà intatta sulla sorgente o sulla destinazione, a seconda dell'interruzione:
$ mv a b c/
Come ho ottenuto la mia risposta:
$ mv --version
mv (GNU coreutils) 8.21
$ info mv
... It first uses some of the same code that's used by `cp -a'
to copy the requested directories and files, then (assuming the copy
succeeded) it removes the originals. If the copy fails, then the part
that was copied to the destination partition is removed. If you were
to copy three directories from one partition to another and the copy of
the first directory succeeded, but the second didn't, the first would
be left on the destination partition and the second and third would be
left on the original partition.
Come test, ho copiato una cartella di grandi dimensioni in una directory NFS, interrotta, e il numero di file nella mia cartella di grandi dimensioni di origine è rimasto lo stesso e i contenuti parziali sono stati lasciati nella directory NFS. Ho usato "find. -Type f | wc -l" per verificare.
Sembra che la risposta di Simon sia corretta.
La risposta accettata è decisamente sbagliata nello spostarsi tra i file system, un fatto che mi ha già salvato un sacco di problemi già un paio di volte. Quando si sposta una directory che contiene sottodirectory, nessun file in una sottodirectory verrà eliminato prima che l'intera sottodirectory sia stata copiata. Questo è, tra l'altro, il vero significato di "oggetto per oggetto" - una sottodirectory È un oggetto (file) e quindi la sua integrità deve essere preservata da una copia completa nella destinazione prima che qualcosa possa essere cancellato. Quindi la risposta di Simon mi appare corretta.
No. mv opera oggetto per oggetto, quindi gli oggetti che sono già stati elaborati verranno rimossi dall'origine.
Assolutamente no. Lo spostamento viene effettuato oggetto per oggetto. Quindi, l'oggetto spostato verso la destinazione fino al punto di interruzione non deve più esistere nella sorgente.
Se mv è stato emesso per un file di grandi dimensioni (tra diversi) ed è stato interrotto, l'origine sarà intatta. Sul bersaglio vedrai un file incompleto fino al punto di interruzione.
Puoi comunque ripristinare mv con lo stesso comando e il processo continuerà.
Se vuoi interrompere mv perché vuoi disconnetterti dal terminale, puoi semplicemente inviarlo in background:
* press Ctrl+Z
# bg
# disown
fsck
(che molto probabilmente verrà eseguito automaticamente al riavvio, poiché il disco non è stato smontato in modo pulito).