GNU/Linux >> Tutoriels Linux >  >> Linux

Filtre Rsync :copie d'un seul motif ?

J'essaie de créer un répertoire qui hébergera tous et uniquement mes fichiers PDF compilés à partir de LaTeX. J'aime garder chaque projet dans un dossier séparé, le tout logé dans un gros dossier appelé LaTeX . J'ai donc essayé d'exécuter :

rsync -avn *.pdf ~/LaTeX/ ~/Output/

qui devrait trouver tous les pdfs dans ~/LaTeX/ et transférez-les dans le dossier de sortie. Cela ne fonctionne pas. Il me dit qu'il n'a trouvé aucune correspondance pour "*.pdf “. Si je laisse de côté ce filtre, la commande répertorie tous les fichiers de tous les dossiers du projet sous LaTeX. C'est donc un problème avec le filtre *.pdf. J'ai essayé de remplacer ~/ avec le chemin complet de mon répertoire personnel, mais cela n'a eu aucun effet.

J'utilise zsh. J'ai essayé de faire la même chose dans bash et même avec le filtre qui répertorie chaque fichier dans chaque sous-répertoire… Que se passe-t-il ici ?

Pourquoi rsync ne comprend-il pas mon filtre pdf uniquement ?

D'ACCORD. Alors mise à jour :Non, j'essaie

rsync -avn --include="*/" --include="*.pdf" LaTeX/ Output/

Et cela me donne toute la liste des fichiers. Je suppose que parce que tout correspond au premier modèle…

Réponse acceptée :

TL,DR :

rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/

Rsync copie la ou les sources vers la destination. Si vous passez *.pdf en tant que sources, le shell l'étend à la liste des fichiers avec le .pdf extension dans le répertoire courant. Aucune traversée récursive ne se produit car vous n'avez transmis aucun répertoire en tant que source.

Vous devez donc exécuter rsync -a ~/LaTeX/ ~/Output/ , mais avec un filtre pour dire à rsync de copier .pdf fichiers uniquement. Les règles de filtrage de Rsync peuvent sembler intimidantes lorsque vous lisez le manuel, mais vous pouvez construire de nombreux exemples avec seulement quelques règles simples.

  • Inclusions et exclusions :

    • Il est facile d'exclure des fichiers par nom ou par emplacement :--exclude=*~ , --exclude=/some/relative/location (par rapport à l'argument source, par exemple cela exclut ~/LaTeX/some/relative/location ).
    • Si vous ne souhaitez faire correspondre que quelques fichiers ou emplacements, incluez-les, incluez tous les répertoires qui y mènent (par exemple avec --include=*/ ), puis excluez le reste avec --exclude='*' . C'est parce que :
    • Si vous excluez un répertoire, cela exclut tout ce qui se trouve en dessous. Les fichiers exclus ne seront pas du tout pris en compte.
    • Si vous incluez un répertoire, cela n'inclut pas automatiquement son contenu. Dans les versions récentes, --include='directory/***' va le faire.
    • Pour chaque fichier, la première règle de correspondance s'applique (et tout ce qui n'a jamais trouvé de correspondance est inclus).
  • Motifs :

    • Si un modèle ne contient pas de / , il s'applique au nom de fichier sans répertoire.
    • Si un modèle se termine par / , il s'applique uniquement aux répertoires.
    • Si un modèle commence par / , il s'applique à tout le chemin depuis le répertoire qui a été passé en argument à rsync .
    • * toute sous-chaîne d'un seul composant de répertoire (c'est-à-dire ne correspond jamais à / ); ** correspond à n'importe quelle sous-chaîne de chemin.
  • Si un argument source se termine par un / , son contenu est copié (rsync -r a/ b crée b/foo pour chaque a/foo ). Sinon, le répertoire lui-même est copié (rsync -r a b crée b/a ).

En relation :Quand utiliseriez-vous un descripteur de fichier supplémentaire ?

Ainsi, ici, nous devons inclure *.pdf , inclure les répertoires qui les contiennent et exclure tout le reste.

rsync -a --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/

Notez que cela copie tous les répertoires, même ceux qui ne contiennent aucun fichier ou sous-répertoire correspondant. Cela peut être évité avec le --prune-empty-dirs option (ce n'est pas une solution universelle puisque vous ne pouvez pas copier un répertoire même en le faisant correspondre explicitement, mais c'est une exigence rare).

rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/

Linux
  1. Comment s'assurer qu'une seule instance d'un script Bash s'exécute ?

  2. Sed :imprimer uniquement la première occurrence d'une correspondance de modèle ?

  3. Journaliser uniquement les fichiers transférés avec Rsync ?

  4. Rsync modifie les autorisations du répertoire ?

  5. Rsync Deux types de fichiers en une seule commande ?

Comment utiliser Rsync

Comment entrer dans un répertoire dont le nom n'est qu'un moins ?

Façon de synchroniser une seule partition ?

Exemples de commandes Linux rsync

Configuration de DRBD avec un seul nœud

Copier une grande arborescence de répertoires localement ? cp ou rsync ?