2 votes

Rsync en utilisant shopt globstar et **/. - comment exclure des répertoires ?

Je tente de synchroniser tous les fichiers à partir d'une grande structure de répertoires dans un seul répertoire racine (c'est-à-dire sans créer les sous-répertoires mais en incluant tous les fichiers récursifs).

Environnement :

  • Ubuntu 12.04 x86
  • RSYNC version 3.0.9
  • GNU bash version 4.2.25(1)

Jusqu'à présent, j'ai cette commande appelée à partir d'un script bash qui fonctionne bien et fournit la fonctionnalité de base requise :

shopt -s globstar
rsync -adv /chemin/vers/source/**/. /chemin/vers/dest/. --exclude-from=/monfichierd'exclusion

Le contenu de monfichierd'exclusion est :

nomdufichier
*/
# le */ empêche tous les répertoires d'apparaître dans /chemin/vers/dest/

# d'autres tentatives infructueuses ont inclus :
repertoire1
repertoire1/
repertoire1/*

Je dois maintenant exclure les fichiers situés à l'intérieur de certains répertoires dans l'arborescence source. Cependant, en raison de l'approche globstar consistant à regarder dans tous les répertoires, rsync est incapable de faire correspondre les répertoires à exclure. En d'autres termes, à l'exception de mes règles /* et nomdufichier, tout le reste est complètement ignoré.

Je recherche donc de l'aide sur la syntaxe des exclusions ou s'il existe une autre manière d'effectuer la synchronisation de nombreux répertoires dans un seul répertoire de destination qui n'utilise pas mon approche globstar.

Toute aide ou conseil serait très apprécié.

1voto

konsolebox Points 21338

Si vous souhaitez exclure des répertoires d'une correspondance globstar, vous pouvez les enregistrer dans un tableau, puis filtrer le contenu de ce tableau en fonction d'un fichier.

Exemple:

#!/bin/bash

shopt -s globstar

declare -A X
readarray -t XLIST < exclude_file.txt
for A in "${XLIST[@]}"; do
    X[$A]=.
done

DIRS=(/chemin/vers/source/**/.)
for I in "${!DIRS[@]}"; do
    D=${DIRS[I]}
    [[ -n ${X[$D]} ]] && unset 'DIRS[I]'
done

rsync -adv "${DIRS[@]}" /chemin/vers/dest/.

Exécuter avec:

bash script.sh

Remarque: les valeurs dans exclude_file.txt doivent vraiment correspondre aux valeurs étendues dans /chemin/vers/source/**/..

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X