Cosa succede se mv viene interrotto?


72

Cosa succede se il mvcomando Linux viene interrotto? Dì, sto spostando un'intera directory in qualche altro posto e la interrompo mentre si sta spostando. La directory di origine rimarrà intatta?

Risposte:


51

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/direliminerà la voce della directory di dirda /sourcee ne creerà una nuova in /target. Questo è fatto da una chiamata al sistema atomico (cioè, ininterrotta). L'inode contenente le voci della directory dire 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 mvdurante la copia, potresti finire con due copie di alcuni file: nella posizione precedente e in quella nuova.


6
@Wesley: No, non ci saranno file parziali. Se il sistema rimane attivo (ad esempio, premi Ctrl-C), verrà rimosso automaticamente. In caso contrario (ad es., Perdita di potenza), il file parziale potrebbe essere lasciato inaccessibile sul disco di destinazione, ma dovrebbe essere ripulito dal successivo fsck(che molto probabilmente verrà eseguito automaticamente al riavvio, poiché il disco non è stato smontato in modo pulito).
Dave Sherohman,

50
Sbagliato. Se si sposta dir da una fs a un'altra mv / fs1 / dir / fs2 / e si interrompe, / fs1 / dir / rimarrà completamente qui. / fs1 / dir viene rimosso solo quando lo spostamento è completo.

8
user263131 ha ragione. Esegui strace mv /fs1/dir /fs2/: l' ultima cosa che mv fa è chiamare contemporaneamente unlinkattutti i file sorgente (non uno per uno mentre vengono copiati).
Jakob,

7
@JJ Sembra che tu abbia usato un'espansione bash, nel qual caso mv tratta ogni file dell'espansione come una fonte separata (facendoli così individualmente).
gkanwar,

5
Quindi .... @bmk o altri, vuoi aggiornare questa risposta per essere meno ... sbagliata?
Artem Russakovskii,

35

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à

  • creare c / a
  • copia a / d -> c / a / d
  • copia a / e -> c / a / e
  • cancella a / d
  • elimina a / e
  • cancella a
  • copia b -> c / b
  • elimina b

1
Potete fornire una fonte per questo? Altri rispondenti affermano che un file sorgente viene cancellato immediatamente dopo che è stato copiato su un fs diverso (cioè non tutti copiati e poi tutti cancellati).
Jamesbtate,

1
Esperienza. Ho aggiunto un esempio per chiarire in che modo la mia risposta e gli altri sono coerenti. Se si elencano solo singoli file, in effetti ogni file verrà eliminato immediatamente.
Simon Richter,

Osservo il comportamento descritto in questa risposta su macOS, cioè anche con un BSD mv, quindi non è solo GNU.
Kirelagin,

12

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.


9

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.


4

No. mv opera oggetto per oggetto, quindi gli oggetti che sono già stati elaborati verranno rimossi dall'origine.


2

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


2

Se vuoi interrompere mv perché vuoi disconnetterti dal terminale, puoi semplicemente inviarlo in background:

* press Ctrl+Z

# bg
# disown

1
Questo è un buon punto, ma non risponde alla domanda reale.
Julie Pelletier,

1
@JuliePelletier, ma è quello che stavo cercando, quindi qualcuno potrebbe essere interessato a farlo.
Курочка Ряба,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.