Question Outil ou script permettant de détecter les fichiers déplacés ou renommés sous Linux avant une sauvegarde [fermé]


En gros, je cherche à savoir s’il existe un outil ou un script capable de détecter les fichiers déplacés ou renommés afin de pouvoir obtenir une liste des fichiers renommés / déplacés et d’appliquer la même opération à l’autre extrémité du réseau pour économiser la bande passante.

Fondamentalement, le stockage sur disque est bon marché, mais pas la bande passante. Le problème est que les fichiers seront souvent réorganisés ou déplacés dans une meilleure structure de répertoires. Ainsi, lorsque vous utilisez rsync pour effectuer la sauvegarde, rsync ne remarquera pas qu'il s'agit d'un fichier renommé ou fichier déplacé et retransmettez-le sur le réseau une fois de plus en dépit du fait que le même fichier se trouve à l’autre bout.

Je me demande donc s’il existe un script ou un outil capable d’enregistrer où se trouvent tous les fichiers et leurs noms. Une analyse juste avant une sauvegarde permettrait de réanalyser et de détecter les fichiers déplacés ou renommés, puis de prendre cette liste et de l’appliquer à nouveau. l'opération déplacer / renommer de l'autre côté.

Voici une liste des fonctionnalités "générales" des fichiers:

  1. Gros fichiers immuables
  2. Ils peuvent être renommés ou déplacés

[Modifier:] Ce sont toutes de bonnes réponses, et ce que j'ai fini par faire, c'est de regarder toutes les réponses et d'écrire du code pour gérer cela. Fondamentalement, ce que je pense / travaille actuellement est:

  1. Utiliser quelque chose comme AIDE pour le scan "initial" et me permettre de conserver des sommes de contrôle sur les fichiers car ils sont censés ne jamais changer, cela faciliterait la détection de la corruption.
  2. Créer un démon inotify qui surveillerait ces fichiers / répertoires et enregistrer toutes les modifications relatives au renommage et au déplacement des fichiers dans un fichier journal.
  3. Dans certains cas extrêmes, inotify peut ne pas enregistrer que quelque chose s'est passé dans le système de fichiers. final étape d'utilisation de find pour rechercher dans le système de fichiers les fichiers dont l'heure de changement est inférieure à celle du fichier. dernière sauvegarde.

Cela présente plusieurs avantages:

  1. Checksums / etc de AIDE pour pouvoir vérifier / s’assurer que certains supports n’ont pas été corrompus
  2. Inotify réduit l'utilisation des ressources et évite de refaire le scan du système de fichiers
  3. Pas besoin de patcher rsync; Si je dois appliquer des correctifs dans la mesure du possible, mais je préférerais éviter de corriger ces problèmes pour alléger le fardeau (IE n'a pas besoin de le corriger à chaque fois qu'il y a une mise à jour).
  4. J'ai déjà utilisé Unison auparavant et c'est vraiment agréable, mais j'aurais pu jurer que Unison conserve des copies sur le système de fichiers et que ses fichiers "archives" peuvent devenir assez volumineux?

15
2017-08-18 14:38


origine




Réponses:


Unisson http://www.cis.upenn.edu/~bcpierce/unison/ prétend pouvoir détecter les mouvements et les renommer.

Il existe plusieurs correctifs à rsync pour ajouter la détection de déplacement / renommage:

http://gitweb.samba.org/?p=rsync-patches.git;a=blob;f=detect-renamed-lax.diff;h=1ff593c8f97a97e8970d43ff5a62dfad5abdddd75;hb=master

http://gitweb.samba.org/?p=rsync-patches.git;a=blob;f=detect-renamed.diff;h=c3e6e846eab437e56e25e2c334e292996ee84345;hb=master

L’entrée Bugzilla qui suit ce problème: https://bugzilla.samba.org/show_bug.cgi?id=2294


7
2017-08-18 16:38



Pourquoi ces correctifs ne sont-ils pas intégrés? Ils ajoutent simplement des drapeaux, ils ne sont pas intrusifs. Un autre patch intéressant est rsyncsums, qui peut garder des sommes de contrôle entre les exécutions de rsync. - Tobu


C’est un peu une solution bizarre, mais ... git détecte les déplacements et les renomme en fonction du contenu du fichier, donc si vous gardiez les répertoires en question sous contrôle de version, alors il serait capable de détecter les déplacements et autres, et d’éviter de transférer les répertoires. contenu (car il se trouve déjà des deux côtés du fil) tout en déplaçant des objets dans l’arbre.

Juste une pensée.


5
2017-08-18 16:04



Oui, j’envisageais cela, si les fichiers étaient petits et basés sur du texte, cela fonctionnerait probablement bien, mais ils sont binaires et la taille totale approche d’un Terabyte. - Pharaun
@Pharaun Vous auriez besoin de l'index git sans le stockage d'objets blob. Peut-être extraire ce code de git et l'ajouter à libgit2. - Tobu
Le code pertinent commence par refresh_index dans read-cache.c. - Tobu


suggestions intéressantes ici. Aussi pensé à utiliser les capacités du système de fichiers, par exemple ZFS. J'ai trouvé étrange qu'il n'y ait aucun outil qui fasse cette chose simple. L'option Unison ne fonctionne pas dans la plupart des cas, comme le signalent les gens, pas pour moi non plus.

Je souhaite que cette fonctionnalité conserve la synchronisation de la sauvegarde de ma collection de films sur le deuxième disque dur lors de la réorganisation des dossiers.

Maintenant, j'ai trouvé ce script C simple http://sourceforge.net/projects/movesync/

Semble bien fonctionner. Exécutez-le puis synchronisez normalement avec, par exemple, à l'unisson.


5
2017-11-12 21:12





Vous pourriez peut-être utiliser un ID basé sur l'hôte tel que AIDE et écrivez un script wrapper en utilisant sa sortie. Vous devrez probablement écrire une logique plus complexe en tenant compte des sommes de contrôle.

Sinon, un système de fichiers basé sur le réseau pourrait être utile, car les modifications seraient répercutées à tous les emplacements. Néanmoins, je soupçonne que vous effectuez un transfert sur Internet, ce qui limitera les options ici.


4
2017-08-18 15:20



C’était ce que je pensais faire, en prenant un de ceux-ci et en les prolongeant. De plus, oui, je le transfère sur Internet et la bande passante est assez limitée. - Pharaun


Vous pourriez essayer unisson ; en particulier le

-xferbycopying optimise les transferts   en utilisant des copies locales (true par défaut)

option mentionnée dans le docs comme

Lorsque cette préférence est définie, Unison   va essayer d'éviter de transférer le fichier   contenus sur le réseau par   reconnaître quand un fichier avec le   le contenu requis existe déjà dans   la réplique cible. Ce généralement   permet aux transferts de fichiers d'être propagés   très rapidement. La valeur par défaut est   vrai.

on dirait que ça pourrait faire ce que tu veux.


3
2017-08-18 16:37



En fait, avec le recul, j'aurais peut-être été trop pressé par le commentaire à l'unisson. Est-ce que unison prend en charge le remplacement d’un lien physique par le contenu réel du fichier s’il change? Si c'est le cas, je pourrais peut-être faire de la magie avec rsnapshot + unison qui satisferait mes exigences sans avoir à écrire une tonne de nouveau code / log / etc pour gérer cela. - Pharaun


Syrep fait ce dont vous avez besoin. Il conserve les résumés des messages dans une arborescence de fichiers à jour; garder les digests autour rend plus efficace que rsync. Il a été conçu pour Sneakernet, vous pouvez donc ajouter un wrapper qui met à jour / makepatch / merge en même temps.


3
2017-11-12 22:24





Je ne sais pas s’il existe un outil qui le fait pour vous, mais vous pouvez écrire un script simple qui exécute un find sur le répertoire de base où mtime est plus récent que la dernière sauvegarde. Cela vous donnera une liste de tous les fichiers qui ont été modifié. Si un fichier a simplement été déplacé, il n'apparaîtra pas dans la liste. Malheureusement, cette liste inclura les répertoires dans lesquels les fichiers ont été déplacés, car le répertoire est mis à jour lorsqu'un fichier est ajouté / supprimé.

Avec cette liste de fichiers, vous pouvez utiliser rsync pour ne synchroniser que ces fichiers. rsync a une option pour lire une liste de fichiers. Voici un test montrant cet exemple:

$ cd tmp
$ echo test > test
$ ls -la
total 16
drwxr-xr-x 2 root root 4096 Aug 18 11:34 .
drwxr-x--- 5 root root 4096 Aug 18 11:34 ..
-rw-r--r-- 1 root root    5 Aug 18 11:34 test
$ mkdir tmp2
$ find . -mmin 1
$ date
Wed Aug 18 11:35:10 EDT 2010
$ find . -mmin 1
$ find . -mmin 2
.
./test
./tmp2
$ mv test tmp2
$ find . -mmin 1
.
./tmp2

Veuillez noter que j'ai attendu environ 1 minute entre chaque exécution find commander. Cela montre que lors de la création initiale du fichier, il est répertorié par find. Si je déplace le fichier dans un autre répertoire et relance le processus find commande, il affiche uniquement le répertoire dans lequel j'ai déplacé le fichier, et non le fichier lui-même. Vous pouvez utiliser une combinaison de find et rsync Commandes pour ne lister que les fichiers que vous voulez, il peut probablement atteindre votre objectif.

J'espère que ça aide.


2
2017-08-18 15:42