2 votes

rsync tous les pdfs sauf dans certains répertoires ?

J'essaie de comprendre le système de filtrage rsync, mais je suis complètement déconcerté.

J'ai la structure de répertoire "test" suivante pour essayer d'y voir plus clair. Sans options de filtrage, voici tous mes fichiers :

rsync -amv --dry-run /source /target

building file list ... done
source/
source/1.pdf
source/2.pdf
source/exclude_rules.txt
source/filter_rules.txt
source/excludedir/
source/excludedir/2.jpg
source/excludedir/4.pdf
source/subdir/
source/subdir/1.jpg
source/subdir/1.txt
source/subdir/3.pdf
source/subdir/subdir2/
source/subdir/subdir2/6.jpg
source/subdir/subdir2/6.pdf

Je veux juste synchroniser tous *.pdf sauf dans certains répertoires, à savoir tout répertoire qui a *exclude* en elle.

J'utilise un fichier contenant les règles de filtrage avec la commande suivante :

rsync -amv --dry-run --filter='merge /filter_rules' /source /target

Les règles de filtrage ressemblent à des variations de ce qui suit, mais je n'arrive pas à les faire produire les résultats que je recherche :

-/ *exclude*/
+/ *.pdf
-/ *

Ce que j'ai trouvé de mieux, c'est l'exclusion simple :

-/ *exclude*/

Ce qui donne :

building file list ... done
source/
source/1.pdf
source/2.pdf
source/exclude_rules.txt
source/filter_rules.txt
source/subdir/
source/subdir/1.jpg
source/subdir/1.txt
source/subdir/3.pdf
source/subdir/subdir2/
source/subdir/subdir2/6.jpg
source/subdir/subdir2/6.pdf

Comment je filtre le reste pour n'avoir que *.pdf ?

1voto

pixelearth Points 131

Pour la postérité, j'ai finalement réussi à le faire fonctionner, et voici les instructions que j'aurais aimé avoir :

  • rsync lance le processus de filtrage avec une liste complète de fichiers
  • les règles de filtrage sont traitées DANS L'ORDRE (il m'a fallu un certain temps pour comprendre cela)
  • Si vous utilisez des fichiers externes d'exclusion ou d'inclusion, il peut être nécessaire de les réorganiser à l'aide d'un fichier de filtrage qui vous permet de mélanger les règles d'inclusion et d'exclusion, ou de les répertorier dans le client lui-même.
  • pour chaque fichier, la PREMIÈRE RÈGLE DE FILTRAGE QUI CONVIENT place le fichier dans l'une des deux catégories suivantes : inclure ou exclure.
  • Les règles après la première règle correspondante ne sont pas appliquées !
  • Chaque règle n'agit que sur les fichiers qui ont "passé" les règles précédentes sans être appariés.
  • Les fichiers qui ne correspondent à aucune règle sont inclus.
  • La dernière règle est la plus importante et la moins intuitive. Elle consiste à exclure tout ce qui n'a pas été spécifiquement inclus jusqu'à ce point.

Voici donc ce qui a fini par fonctionner :

-/ *exclude*/
+/ */
+/ *.pdf
-/ *

À l'origine, ces règles se trouvaient dans des fichiers d'inclusion et d'exclusion distincts, ce qui ne permettait pas de respecter l'ordre correct.

0voto

J'utilise toujours --exclude-from dans mon rsync, mais ce lien a été remarquablement utile lorsque j'ai essayé de faire fonctionner le filtrage.

https://stackoverflow.com/questions/35364075/using-rsync-filter-to-include-exclude-files

edit - le PO a répondu à cette question dans sa propre réponse, mais comme demandé... une partie utile de ce lien

Explications :

(je n'ai fait que reformuler le manuel en fin de compte, mais comme vous l'avez dit, le manuel est un peu >cryptique).

Les règles sont lues de haut en bas chaque fois qu'un fichier doit être transféré par >rsync. Mais dans votre cas /mnt/data/i-want-to-rsyncthisdirectory/ n'est pas >sauvegardé car vous excluez /mnt et cela court-circuite vos >règles d'inclusion. La solution est donc d'inclure chaque dossier et sous-dossier jusqu'au >dossier que vous voulez sauvegarder, puis d'exclure ce que vous ne voulez pas sauvegarder, sous-dossier par sous-dossier.

Notez le * à la fin de chaque exclusion de sous-dossier. Cela empêchera rsync de >sauvegarder les fichiers et dossiers situés dans ces sous-dossiers, ce qui est ce que vous >voulez, je pense. Solution plus simple : (edit 2)

Vous pouvez même simplifier cela avec le motif *** qui a été ajouté dans la version >2.6.7 :

  • /mnt/

  • /mnt/data/

  • /mnt/data/i-want-to-rsyncthisdirectory/***

  • /mnt/**

Cet opérateur vous permet d'utiliser le caractère générique ** pour l'exclusion et >par conséquent de n'avoir qu'une seule ligne d'exclusion.

J'ai également découvert que vous pouvez comprendre quelles règles de filtrage excluent/incluent >chaque fichier ou dossier grâce aux arguments rsync suivants :

--verbose --verbose

Combiné avec l'argument --dry-run, vous devriez être en mesure de déboguer votre problème > :)

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X