J'ai (bien, j'avais ) un répertoire:
/media/admin/my_data
Il faisait environ 49 Go et contenait des dizaines de milliers de fichiers. Le répertoire est le point de montage d'une partition LUKS active.
Je voulais renommer le répertoire en:
/media/admin/my_data_on_60GB_partition
Je n'avais pas réalisé à l'époque, mais j'ai lancé la commande à partir du répertoire personnel et j'ai donc fini par:
~% sudo mv /media/admin/my_data my_data_on_60GB_partition
Alors, le mv
programme a commencé à se déplacer /media/admin/my_data
et son contenu dans un nouveau répertoire ~/my_data_on_60GB_partition
.
J'ai utilisé Ctrl+ Cpour annuler la commande en cours, alors maintenant j'ai un tas de fichiers répartis dans des répertoires:
~/my_data_on_60GB_partition <--- about 2GB worth files in here
et
/media/admin/my_data <---- about 47GB of orig files in here
Le nouveau répertoire ~/my_data_on_60GB_partition
et certains de ses sous-répertoires appartiennent à root.
Je suppose que le mv
programme doit avoir initialement copié les fichiers en tant que root, puis les avoir transférés après leur transfert chown
sur mon compte utilisateur.
J'ai une sauvegarde un peu ancienne du répertoire / partition.
Ma question est la suivante: est-il possible de restaurer de manière fiable le groupe de fichiers déplacés?
C'est-à-dire, puis-je simplement lancer:
sudo mv ~/my_data_on_60GB_partition/* /media/admin/my_data
ou dois-je arrêter d'essayer de récupérer, car les fichiers sont peut-être corrompus et partiellement complets, etc.?
- OS - Ubuntu 16.04
mv --version
mv (GNU coreutils) 8.25
la source
Control-Z
(pour faire une pause) plutôt queControl-C
. Dans ce cas, vous pourrez alors voir quel fichier a été transféré à ce moment-là et ainsi savoir quel fichier n'a été que partiellement copié. Vous pouvez alors décider calmement de la manière de procéder. (Utilisezkill -stop
pour les processus pas dans le tty).(2GB + 47GB) < 60GB
. la capacité de la partition est de 60 Go, la taille du dossier et son contenu: 49 Go.Réponses:
Lorsque vous déplacez des fichiers entre des systèmes de fichiers,
mv
ne supprimez pas un fichier avant de l'avoir fini, et traite les fichiers de manière séquentielle (je disais au départ qu'il copiait puis supprimait chaque fichier à tour de rôle, mais cela n'est pas garanti - au moins, GNUmv
copie ensuite, supprime chaque commande- ligne à son tour, et POSIX spécifie ce comportement ). Donc, vous devriez avoir au plus un fichier incomplet dans le répertoire cible, et l'original sera toujours dans le répertoire source.Pour remettre les choses en arrière, ajoutez le
-i
drapeau afin demv
ne rien écraser:(en supposant que vous n’ayez pas de fichiers cachés à restaurer
~/my_data_on_60GB_partition/
), ou mieux encore (étant donné que, comme vous l’avez découvert, vous pourriez avoir plusieurs fichiers en attente de suppression), ajoutez le-n
drapeau afin demv
ne rien écraser mais de ne pas écraser. vous demander à ce sujet:Vous pouvez également ajouter le
-v
drapeau pour voir ce qui est fait.Quelle que soit la compatibilité POSIX
mv
, la structure de répertoires d'origine doit rester intacte. Vous pouvez également vérifier - et simplement supprimer/media/admin/my_data
... (dans le cas général, je pense que lamv -n
variante est l'approche sécurisée - elle gère toutes les formes demv
, y compris par exemplemv /media/admin/my_data/* my_data_on_60GB_partition/
)Vous aurez probablement besoin de restaurer certaines autorisations. vous pouvez le faire en masse en utilisant
chown
etchmod
, ou les restaurer à partir de sauvegardes en utilisantgetfacl
etsetfacl
(merci à Sato Katsura pour le rappel ).la source
find
pour rechercher et définir des autorisations. Il y a beaucoup de fichiers dans le nouveau répertoire qui ont des espaces dans les noms de fichiers, mais pas de fichiers cachés - à ma connaissance. Pensez-vous que le glob dans la commandesudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/
développerait le nom du fichier sans problèmes de fractionnement des mots? Je pensais utiliser alternativement cesudo rsync ~/my_data_on_60GB_partition/ /media/admin/my_data/
qui, à mon avis, permettrait de gérer les chemins de fichiers avec des espaces?rsync
place, afin de vérifier également l'intégrité de tous les fichiers. Mais c'est bien de savoir que je n'ai pas besoin de ça.su command mv -i ...
(ousu /bin/mv -i ...
), au lieu desudo mv -i ...
), au cas où un administrateur (bizarre) créerait "mv" une fonction effectuant "mv -f" au niveau du système (c'est-à-dire / etc / profile ou de tels fichiers système) .. .command quelque chose: lancez la commande somthing, et non une fonction ou un alias du même nom. (par exemple: on pourrait être (très!) malchanceux et avoir un (très, très mauvais!)function mv { /bin/mv -f -- "$@" }
dans un fichier toujours recherché, puis "rm -i quelque chose" ne demandera rien (et protesterait simplement que "-i "le fichier n'existe pas!) ... [J'ai vu de telles choses ... frissonner ]Après avoir obtenu la réponse de Stephen Kitt et discuté de cette commande en tant que solution potentielle:
J'ai décidé de m'arrêter jusqu'à ce que je comprenne ce qui se passait, cette réponse décrit ce que j'ai découvert et que j'ai fini par faire.
J'utilise Gnu
mv
qui copie les fichiers sur la cible, puis seulement si l'opération de copie réussit, elle supprime l'original.Cependant, je voulais vérifier si
mv
cette séquence est exécutée un fichier à la fois. Si cela était vrai, le contenu du dossier original aurait été proprement découpé en deux parties, une partie déplacée vers la destination, l'autre restant à la source. Et peut-être y aurait-il un fichier qui aurait été interrompu pendant la copie et qui serait commun entre les deux répertoires - et il serait probablement mal formé.Pour découvrir les fichiers communs entre les deux répertoires, j'ai exécuté:
Ce résultat suggère qu'il y a 14 237 instances des mêmes fichiers dans les répertoires source et cible, ce que j'ai confirmé en vérifiant les fichiers manuellement - oui, il y avait beaucoup de fichiers identiques dans les deux répertoires. Cela suggère que c'est seulement après la
mv
copie de grandes quantités de fichiers qu'il supprime les fichiers source. Une recherche rapideinfo
surmv
commande a montréJe n'ai pas exécuté la commande mais je soupçonne que si j'ai essayé de courir
L'
-i
invite avant de remplacer aurait probablement déclenché plus de 14 000 fois.Alors, pour savoir combien de fichiers se trouvent dans le répertoire nouvellement créé:
Ainsi, s'il y avait un total de 14238 fichiers ordinaires dans le nouveau répertoire et que 14237 avaient des originaux identiques dans la source, cela signifie qu'il n'y avait qu'un seul fichier dans le nouveau répertoire qui ne contenait pas de fichier identique correspondant dans la source. Pour savoir en quoi consistait ce fichier, j’ai renvoyé rsync dans le sens source:
Une vérification rapide a confirmé qu'il s'agissait du fichier mal formé, où il existait à la fois sur la source et la destination, fichier de destination = 64 Mo, original = 100 Mo. Ce fichier et sa hiérarchie de répertoires appartenaient toujours à root et les autorisations d'origine n'avaient pas encore été restaurées.
Donc en résumé:
mv
n'ont jamais été atteints sont toujours dans leur emplacement d'origine (évidemment)mv
ont été copiés complètement avaient toujours leurs copies originales dans le répertoire sourceEn d'autres termes, tous les fichiers d'origine étaient encore intacts et la solution dans ce cas était simplement de supprimer le nouveau répertoire!
la source
-n
serait mieux dans le cas général. J'ai vérifié lemv
code source, il supprime l'argument source un à la fois.mv
la suppression a lieu sur la source. La commandemv foo bar baz
se déplacerait alorsfoo
pour supprimer l'original puis pour passer à ..?baz/foo
foo
bar
baz/bar
cmp
plutôt quediff
de comparer des fichiers binaires. En outre, votre discussion ci-dessus n'a de sens que lorsque vous déplacez des fichiers entre différents systèmes de fichiers. Aucune copie n'est impliquée lors du déplacement de fichiers dans le même système de fichiers.Je pensais juste que je ferais remarquer que certaines personnes pourraient être tentées d’ajouter «xargs» au mélange pour gérer les choses en parallèle. Cela me donne les willies et j'aime vraiment la solution rsync ci-dessus.
En ce qui concerne le système de fichiers concernant le déplacement et la copie et le moment exact où l'original est supprimé, le VFS et le (s) système (s) de fichiers sous-jacent se coordonnent pour garantir une atomicité par fichier avant d'arriver à cette étape de suppression. Ainsi, même s'il est interrompu avant que le fichier cible ne soit complètement écrit, tout le verrouillage dans le système de fichiers virtuel est très strict et protège contre des opérations telles que l'entrelacement aléatoire des données, même dans des cas parallèles. (J'ai travaillé sur des systèmes Linux VFS et NFS4)
L'ajout de «xargs» au mélange aurait probablement fait de l'étape de double vérification la santé mentale un casse-tête, avec plusieurs fichiers en cours de transit. J'aurais aimé avoir plus de scripts de niveau système. Bons rappels pour moi!
J'ai adoré la question, bon pour les toiles d'araignées, et me fait aimer de nouveau rsync. À votre santé!
la source