Que se passe-t-il si la mv
commande 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?
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/dir
supprimera l’entrée du répertoire dir
de /source
et 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 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, 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 mv
pendant la copie, vous risquez de vous retrouver avec deux copies de certains fichiers, à l'ancien et à l'emplacement actuel.
fsck
(qui s’exécutera probablement automatiquement au redémarrage, car le disque n’a pas été démonté proprement).strace mv /fs1/dir /fs2/
- la dernière chose que mv fait consiste à appelerunlinkat
tous les fichiers source en même temps (pas un par un car ils sont copiés).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
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
la source
mv
également, de sorte qu'il n'est pas uniquement GNU.Vous déplacez un répertoire, interrompez le déplacement et le répertoire d'origine reste intact:
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:
Comment j'ai eu ma réponse:
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.
la source
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.
la source
N ° mv fonctionne objet par objet, les objets déjà traités seront supprimés de la source.
la source
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.
la source
Si vous souhaitez interrompre mv parce que vous souhaitez vous déconnecter du terminal, vous pouvez simplement l'envoyer en arrière-plan:
la source