Que se passe-t-il si le Linux mv
est interrompue ? Disons que je déplace un répertoire entier vers un autre endroit et que je l'interromps pendant le déplacement. Le répertoire source restera-t-il intact ?
Réponses
Trop de publicités?Si vous déplacez un répertoire sur le même système de fichiers, vous ne faites que déplacer l'entrée du répertoire d'un emplacement du système de fichiers à un autre. Par exemple, mv /source/dir /target/dir
supprimera l'entrée du répertoire de dir
de /source
et en créer un nouveau dans /target
. Cela se fait par un appel système atomique (c'est-à-dire ininterrompu). L'inode contenant les entrées de répertoire de dir
ainsi que le contenu du répertoire lui-même ne sont pas affectés.
Si vous déplacez le répertoire d'un système de fichiers à un autre, tous les fichiers sont d'abord copiés sur le nouveau système de fichiers, puis dissociés du système d'origine. Donc si vous interrompez mv
pendant la copie, vous pouvez vous retrouver avec deux copies de certains fichiers - à l'ancien emplacement et au nouvel emplacement.
L'implémentation GNU itère sur les arguments de la ligne de commande, essaie d'abord de renommer, et, si cela échoue, copie récursivement puis supprime récursivement la source. Ainsi,
mv a b c/
supprimera a avant de copier b et ne commencera pas à effacer quoi que ce soit dans la base de données de l'UE. a avant que la copie de destination ne soit terminée.
Notez que ceci s'applique uniquement à l'implémentation GNU.
Pour clarifier : si a est un répertoire contenant d y e y b est un fichier, l'ordre sera
- créer c/a
- copie a/d -> c/a/d
- copier a/e -> c/a/e
- supprimer a/d
- supprimer a/e
- supprimer un
- copie b -> c/b
- supprimer b
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 d'eux sera intact sur la source ou la destination, selon le moment où vous l'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 grand dossier sur un répertoire NFS, je l'ai interrompu, et le nombre de fichiers dans mon grand dossier source est resté le même, et le contenu partiel a été laissé sur 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.
La réponse acceptée est définitivement erronée en ce qui concerne le déplacement entre les systèmes de fichiers - un fait qui m'a déjà sauvé de nombreux problèmes à plusieurs reprises. Lors du déplacement d'un répertoire qui contient des sous-répertoires, aucun fichier d'un sous-répertoire ne sera supprimé avant que le sous-répertoire entier n'ait été copié. C'est d'ailleurs la signification réelle de "objet par objet" - un sous-répertoire EST un objet (fichier) et donc son intégrité doit être préservée par une copie complète à destination avant que quoi que ce soit puisse être supprimé. La réponse de Simon me semble donc être la bonne.
- Réponses précédentes
- Plus de réponses