Je viens de “mv” éditer un répertoire de 49 Go sur un chemin de fichier incorrect, est-il possible de restaurer l'état d'origine des fichiers?

58

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 mvprogramme a commencé à se déplacer /media/admin/my_dataet 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_partitionet certains de ses sous-répertoires appartiennent à root.
Je suppose que le mvprogramme doit avoir initialement copié les fichiers en tant que root, puis les avoir transférés après leur transfert chownsur 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
the_velour_fog
la source
36
Prenez l’habitude en paniquant de taper Control-Z(pour faire une pause) plutôt que Control-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. (Utilisez kill -stoppour les processus pas dans le tty).
Meuh
1
2 Go + 47 Go = 60 Go ???
mardi
7
@tbodt (2GB + 47GB) < 60GB. la capacité de la partition est de 60 Go, la taille du dossier et son contenu: 49 Go.
the_velour_fog

Réponses:

87

Lorsque vous déplacez des fichiers entre des systèmes de fichiers, mvne 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, GNU mvcopie 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 -idrapeau afin de mvne rien écraser:

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/

(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 -ndrapeau afin de mvne rien écraser mais de ne pas écraser. vous demander à ce sujet:

sudo mv -n ~/my_data_on_60GB_partition/* /media/admin/my_data/

Vous pouvez également ajouter le -vdrapeau 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 la mv -nvariante est l'approche sécurisée - elle gère toutes les formes de mv, y compris par exemple mv /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 chownet chmod, ou les restaurer à partir de sauvegardes en utilisant getfaclet setfacl(merci à Sato Katsura pour le rappel ).

Stephen Kitt
la source
Merci Stephen Kitt, c'est une aide énorme! Je peux utiliser findpour 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 commande sudo 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 ce sudo rsync ~/my_data_on_60GB_partition/ /media/admin/my_data/qui, à mon avis, permettrait de gérer les chemins de fichiers avec des espaces?
the_velour_fog
6
Juste pour être sûr, lorsque des choses comme OP décrites se produisent, je les utilise à la rsyncplace, 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.
Hauleth
1
@the_velour_fog Globbing gère les espaces dans les noms de fichiers sans problème.
Stephen Kitt
5
J'aurais su command mv -i ...(ou su /bin/mv -i ...), au lieu de sudo 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 ]
Olivier Dulac
3
@OlivierDulac - un exemple parfait de la raison pour laquelle il est déconseillé d'utiliser des alias ou des scripts portant le même nom que les programmes standard.
Joe
19

Après avoir obtenu la réponse de Stephen Kitt et discuté de cette commande en tant que solution potentielle:

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/

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 mvqui 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 mvcette 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é:

~% sudo diff -r --report-identical-files my_data_on_60GB_partition/. /media/admin/mydata/. | grep identical | wc -l
14237

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 mvcopie de grandes quantités de fichiers qu'il supprime les fichiers source. Une recherche rapide infosur mvcommande a montré

Il mvutilise tout d'abord le même code que celui utilisé cp -apour copier les répertoires et les fichiers demandés, puis supprime les originaux (en supposant que la copie soit réussie). Si la copie échoue, la partie copiée sur la partition de destination est supprimée.

Je n'ai pas exécuté la commande mais je soupçonne que si j'ai essayé de courir

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/

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éé:

~% sudo find my_data_on_60GB_partition/ -type f -a -print | wc -l                                                                    
14238

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:

~% sudo rsync -av --dry-run my_data_on_60GB_partition/ /media/admin/my_data
sending incremental file list
./
Education_learning_reference/
Education_learning_reference/Business_Education/
Education_learning_reference/Business_Education/Business_education_media_files/
Education_learning_reference/Business_Education/Business_education_media_files/Jeff Hoffman - videos/
Education_learning_reference/Business_Education/Business_education_media_files/Jeff Hoffman - videos/Jeff and David F interview/
Education_learning_reference/Business_Education/Business_education_media_files/Jeff Hoffman - videos/Jeff and David F interview/018 business plans-identifying main KPIs.flv

sent 494,548 bytes  received 1,881 bytes  330,952.67 bytes/sec
total size is 1,900,548,824  speedup is 3,828.44 (DRY RUN)

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é:

  • tous les fichiers qui mvn'ont jamais été atteints sont toujours dans leur emplacement d'origine (évidemment)
  • tous les fichiers qui mvont été copiés complètement avaient toujours leurs copies originales dans le répertoire source
  • le fichier qui n'a été que partiellement copié avait toujours l'original dans le répertoire source

En 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!

the_velour_fog
la source
Wow ... J'ai mis à jour ma réponse, ce -nserait mieux dans le cas général. J'ai vérifié le mvcode source, il supprime l'argument source un à la fois.
Stephen Kitt
@StephenKitt ah bien. Je me demandais quand mvla suppression a lieu sur la source. La commande mv foo bar bazse déplacerait alorsfoo pour supprimer l'original puis pour passer à ..? baz/foo foobarbaz/bar
the_velour_fog
Oui c'est vrai; En fait, c’est ce que POSIX spécifie (en gros, de sorte que toute erreur affectant un argument source laisse la hiérarchie source entière intacte).
Stephen Kitt
Je pense que vous auriez pu utiliser diff pour trouver le fichier inachevé également.
StarWeaver
1
Vous devriez utiliser cmpplutôt que diffde 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.
Satō Katsura
4

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é!

David Richter
la source
1
Sans parler du problème lorsque les noms de fichiers contiennent des espaces.
Wildcard