Que se passe-t-il si mv est interrompu?


72

Que se passe-t-il si la mvcommande Linux est interrompue? Dis, je déplace un répertoire entier vers un autre endroit et l'interromps pendant qu'il se déplace. Le répertoire source sera-t-il toujours intact?

Réponses:


51

Si vous déplacez un répertoire sur le même système de fichiers, vous ne déplacez que l'entrée de répertoire d'un emplacement du système de fichiers à un autre. Par exemple, mv /source/dir /target/dirsupprimera l’entrée du répertoire dirde /sourceet en créera une nouvelle dans /target. Cela se fait par un appel de système atomique (c'est-à-dire, ininterruptible). L'inode contenant les entrées de répertoire de dirainsi que le contenu réel du répertoire lui-même n'est pas affecté.

Si vous déplacez le répertoire d'un système de fichiers à un autre, tous les fichiers sont d'abord copiés dans le nouveau système de fichiers, puis dissociés de celui d'origine. Ainsi, si vous interrompez mvpendant la copie, vous risquez de vous retrouver avec deux copies de certains fichiers, à l'ancien et à l'emplacement actuel.


6
@ Wesley: Non, il n'y aura pas de fichier partiel. Si le système reste en place (par exemple, vous appuyez sur ctrl-C), il sera automatiquement supprimé. Si ce n’est pas le cas (par exemple, en cas de coupure de courant), le fichier partiel risque d’être laissé dans un endroit inaccessible sur le disque de destination, mais devra être nettoyé au prochain fsck(qui s’exécutera probablement automatiquement au redémarrage, car le disque n’a pas été démonté proprement).
Dave Sherohman

50
Faux. Si vous déplacez dir d'un fs à un autre mv / fs1 / dir / fs2 / et que vous l'interrompez, / fs1 / dir / restera ici complètement. / fs1 / dir est supprimé uniquement lorsque le déplacement est terminé.

8
user263131 a raison. Exécuter strace mv /fs1/dir /fs2/- la dernière chose que mv fait consiste à appeler unlinkattous les fichiers source en même temps (pas un par un car ils sont copiés).
Jakob

7
@JJ On dirait que c'est parce que vous avez utilisé une extension bash, auquel cas mv traite chaque fichier de l'extension comme une source distincte (donc individuellement).
Gkanwar

5
Alors .... @ bmk ou autres, voulez-vous mettre à jour cette réponse pour qu'elle soit moins ... erronée?
Artem Russakovskii

35

L’implémentation GNU itère sur les arguments de la ligne de commande, essaie de renommer d’abord, puis, si cela échoue, copie de manière récursive puis supprime récursivement la source. Alors

mv a b c/

supprimera un avant de copier b , et ne commencera pas rien supprimer dans un avant que la copie de destination est terminée.

Notez que cela s’applique uniquement à l’implémentation GNU.

Pour clarifier: si a est un répertoire contenant d et e , et b est un fichier, la commande sera

  • créer c / a
  • copie a / d -> c / a / d
  • copie a / e -> c / a / e
  • effacer a / d
  • supprimer un / e
  • supprimer un
  • copie b -> c / b
  • supprimer b

1
Pouvez-vous fournir une source pour cela? D'autres répondeurs affirment qu'un fichier source est supprimé immédiatement après sa copie dans un autre fs (c'est-à-dire que tous ne sont pas copiés puis tous supprimés).
jamesbtate

1
Expérience. J'ai ajouté un exemple pour préciser la cohérence de ma réponse et des autres. Si vous ne listez que des fichiers individuels, chaque fichier sera supprimé immédiatement.
Simon Richter

J'observe le comportement décrit dans cette réponse sous macOS, c'est-à-dire avec un BSD mvégalement, de sorte qu'il n'est pas uniquement GNU.
Kirelagin

12

Vous déplacez un répertoire, interrompez le déplacement et le répertoire d'origine reste intact:

$ mv a b/

Si vous déplacez plusieurs répertoires, chacun d'entre eux sera intact, que ce soit sur la source ou sur la destination, en fonction du moment où vous avez interrompu:

$ mv a b c/

Comment j'ai eu ma réponse:

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

En guise de test, j'ai copié un dossier volumineux dans un répertoire NFS, interrompu, et le nombre de fichiers de mon dossier volumineux source est resté identique, et des contenus partiels ont été laissés dans le répertoire NFS. J'ai utilisé "find. -Type f | wc -l" pour vérifier.

On dirait que la réponse de Simon est correcte.


9

La réponse acceptée est sans aucun doute fausse au sujet de la migration entre les systèmes de fichiers - un fait qui m'a déjà épargné pas mal de problèmes. Lors du déplacement d'un répertoire contenant des sous-répertoires, aucun fichier d'un sous-répertoire ne sera supprimé avant que tout le sous-répertoire n'ait été copié. C’est, en réalité, le sens réel du mot "objet par objet" - un sous-répertoire est un objet (fichier) et son intégrité doit donc être préservée par une copie complète à la destination avant que quoi que ce soit puisse être supprimé. La réponse de Simon me semble donc la bonne.



2

Définitivement non. Le mouvement est effectué objet par objet. Ainsi, l’objet déplacé vers la destination jusqu’au point d’interruption n’existera plus dans la source.

Si mv a été émis pour un fichier volumineux (entre différents) et qu'il a été interrompu, la source sera intacte. Sur la cible, vous verrez un fichier incomplet jusqu'au point d'interruption.

Vous pouvez cependant restaurer le mv avec la même commande et le processus se poursuivra.


2

Si vous souhaitez interrompre mv parce que vous souhaitez vous déconnecter du terminal, vous pouvez simplement l'envoyer en arrière-plan:

* press Ctrl+Z

# bg
# disown

1
C’est un bon point, mais cela ne répond pas à la question.
Julie Pelletier

1
@JuliePelletier, mais c'est ce que je recherchais pour que quelqu'un puisse être intéressé à le faire.
Курочка Ряба
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.