Comment utiliser Rsync pour copier uniquement des sous-répertoires spécifiques (mêmes noms dans plusieurs répertoires))

j'ai une telle structure de répertoires sur le serveur 1:

  • données
    • entreprise1
      • unique_folder1
      • other_folder
      • ...
    • entreprise2
      • unique_folder1
      • ...
    • ...

et je veux dupliquer cette structure de dossiers sur le serveur 2, mais copier uniquement les répertoires / sous-répertoires de unique_folder1. I. e. comme résultat doit être:

  • données
    • entreprise1
      • unique_folder1
    • entreprise2
      • unique_folder1
    • ...

je sais que rsync est très bon pour cela. J'ai essayé les options "inclure/exclure" sans succès.

E. G. J'ai essayé:

rsync -avzn --list-only --include '*/unique_folder1/**' --exclude '*' -e ssh user@server.com:/path/to/old/data/ /path/to/new/data/

mais, en conséquence, Je ne vois pas les fichiers/répertoires:

receiving file list ... done
sent 43 bytes  received 21 bytes  42.67 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

Quel est le problème? Des idées?


renseignements supplémentaires: J'ai sudo accès pour les deux serveurs. Une idée que j'ai est d'utiliser find commande et cpio ensemble de copier à nouveau répertoire avec le contenu dont j'ai besoin et après que l'utilisation Rsync. Mais c'est très lent, il y a beaucoup de fichiers, etc.

22
demandé sur Andron 2013-03-28 20:56:20

2 réponses

j'ai trouvé la raison. Comme pour moi, il n'était pas clair que Rsync fonctionne de cette manière.

Donc la commande correcte (pour company1 répertoire uniquement) doit être:

rsync -avzn --list-only --include 'company1/' --include 'company1/unique_folder1/***' --exclude '*' -e ssh user@server.com:/path/to/old/data/ /path/to/new/data
company répertoire. Et bien sûr, nous ne pouvons pas écrire manuellement tous ces company répertoires dans la ligne de commande, afin que nous enregistrer la liste dans le fichier et l'utiliser.


les dernières choses que nous devons faire:

1.Générer inclure le fichier sur le serveur 1, de sorte que son contenu sera (je l'ai utilisé ls et awk):

+ company1/  
+ company1/unique_folder1/***  
...  
+ companyN/  
+ companyN/unique_folder1/***  

2.Copie inclure.txt pour le serveur 2 et d'utiliser la commande:

rsync -avzn                                        \
      --list-only                                  \
      --include-from '/path/to/new/include.txt'    \
      --exclude '*'                                \
      -e ssh user@server.com:/path/to/old/data/    \
      /path/to/new/data
25
répondu Andron 2016-06-10 14:04:28

si le premier motif de correspondance exclut un répertoire, alors tous ses descendants ne seront jamais traversés. Quand vous voulez inclure un répertoire profond par exemple company*/unique_folder1/** mais excluez tout le reste *, vous devez dire à rsync d'inclure tous ses ancêtres aussi:

rsync -r -v --dry-run                       \
    --include='/'                           \
    --include='/company*/'                  \
    --include='/company*/unique_folder1/'   \
    --include='/company*/unique_folder1/**' \
    --exclude='*'

vous pouvez utiliser l'extension brace de bash pour sauver un peu de Dactylographie. Après l'extension brace, la commande suivante est exactement la même que la précédente:

rsync -r -v --dry-run --include=/{,'company*/'{,unique_folder1/{,'**'}}} --exclude='*'
9
répondu yonran 2014-11-06 21:50:28