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


Que se passe-t-il si le Linux mv la commande est interrompue? Dites, je déplace tout un répertoire à un autre endroit et l'interromps pendant qu'il bouge. Le répertoire source sera-t-il toujours intact?


67
2018-03-18 09:25


origine




Réponses:


Si vous déplacez un répertoire sur le même système de fichiers vous ne déplacez l'entrée de répertoire d'un emplacement du système de fichiers vers un autre. Par exemple. mv /source/dir /target/dir va supprimer l'entrée du répertoire de dir de /source et en créer un nouveau /target. Cela se fait par un appel du système atomique (c'est-à-dire sans interruption). le inode contenant les entrées du répertoire de dir ainsi 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 les fichiers sont transférés un par un (comme l'indique Ignacio dans sa réponse), c'est-à-dire si vous interrompez le mv les fichiers déjà transférés sont supprimés du répertoire source.


48
2018-03-18 09:54



@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, perte d'alimentation), le fichier partiel peut être laissé inaccessible sur le disque de destination, mais doit être nettoyé par la suite. fsck (qui sera probablement exécuté automatiquement au redémarrage, car le disque n’a pas été démonté correctement). - Dave Sherohman
Faux. Si vous déplacez dir d'un fs vers un autre mv / fs1 / dir / fs2 / et que vous interrompez, / fs1 / dir / restera ici complètement. / fs1 / dir est supprimé uniquement lorsque le déplacement est terminé.
user263131 a raison. Courir strace mv /fs1/dir /fs2/ - la dernière chose mv fait appelle unlinkat sur tous les fichiers sources à la fois (pas un par un car ils sont copiés). - Jakob
Je suis venu ici après avoir interrompu un "mv /fs1/*.data / fs2". Les fichiers de données de fs1 qui ont été entièrement copiés sur fs2 sont supprimés, indiquant que cela se fait par fichier comme mentionné par bmk. Les répertoires sont peut-être un cas particulier, car vous ne pouvez pas les supprimer tant que tout ce qui est à l'intérieur n'est pas sorti. - J.J
@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 (ce qui les fait individuellement). - gkanwar


L'implémentation GNU effectue une itération sur les arguments de la ligne de commande, tente d'abord de la renommer et, en cas d'échec, copie récursivement puis supprime la source de manière récursive. Alors

mv a b c/

va supprimer une avant de copier b, et ne commencera pas à supprimer quoi que ce soit dans une avant la fin de la copie de destination.

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

Clarifier: si une est un répertoire contenant  et e, et b est un fichier, la commande sera

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

27
2018-03-18 13:18



Pouvez-vous fournir une source pour cela? D’autres répondeurs disent qu’un fichier source est supprimé immédiatement après sa copie dans un fichier fs différent (c.-à-d. Que tous ne sont pas copiés puis tous supprimés). - Puddingfox
Expérience. J'ai ajouté un exemple pour clarifier la cohérence de ma réponse et des autres. Si vous ne répertoriez que des fichiers individuels, chaque fichier sera supprimé immédiatement. - Simon Richter


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

$ mv a b/

Si vous déplacez plusieurs répertoires, chacun sera intact sur la source ou la destination, selon le 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 dans mon dossier source volumineux est resté le même, et des contenus partiels sont resté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.


10
2018-05-15 16:49





La réponse acceptée est sans aucun doute erronée en ce qui concerne le passage d'un système de fichiers à l'autre - un fait qui m'a permis d'économiser beaucoup de problèmes plusieurs fois. Lors du déplacement d'un répertoire contenant des sous-répertoires, aucun fichier dans un sous-répertoire ne sera supprimé avant que tout le sous-répertoire ait été copié. C'est-à-dire, la signification réelle de "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 à destination avant que tout puisse être supprimé. La réponse de Simon me semble donc être la bonne.


6
2018-06-29 13:58





Non, mv opère objet par objet, de sorte que les objets déjà traités seront supprimés de la source.


4
2018-03-18 09:34





Définitivement non. Le mouvement est fait objet par objet. Par conséquent, l'objet déplacé vers la destination jusqu'au point d'interruption ne doit plus exister 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 continuera.


2
2018-03-18 15:25





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

* press Ctrl+Z

# bg
# disown

2
2018-05-28 16:59



C'est un bon point mais cela ne répond pas à la question. - Julie Pelletier
@JuliePelletier, mais c'est ce que je cherchais pour que quelqu'un soit intéressé à le faire. - Курочка Ряба