4 votes

rsync seulement un sous-ensemble spécifique de répertoires

Je dois utiliser rsync pour synchroniser plusieurs répertoires à partir d'un serveur rsync. L'ensemble du module rsync est assez volumineux et j'aimerais éviter de copier les autres parties qui ne sont pas nécessaires.

J'ai les répertoires souhaités sous forme de fichier texte mais j'ai des problèmes pour créer un fichier de règles de filtrage approprié. Mes exigences sont les suivantes :

  • Inclure seulement les répertoires dans ma liste avec tous les fichiers et sous-répertoires qu'ils contiennent.
  • Les fichiers des répertoires inclus doivent être supprimés s'ils sont supprimés sur le serveur.
  • Cependant, tous les .hg Les répertoires (dépôt Mercurial) situés sur mon site mais pas sur le serveur, et tous les fichiers et sous-répertoires qu'ils contiennent, ne doivent pas être supprimés.
  • Les répertoires exclus ne doivent pas être supprimés.

Jusqu'à présent, j'ai créé un fichier filtre qui ressemble à ceci

include sub/dir/I/want/***
include other/sub/dir/I/want/***
...
protect .hg/***
exclude **

Mais cela exclut tout apparemment. Sans le exclude ligne tous les autres fichiers sont également inclus.

2voto

Martin Scharrer Points 245

J'ai trouvé le problème. Mes problèmes ont été causés par la façon dont rsync traite les noms de fichiers. Les chemins d'inclusion absolus (c'est-à-dire relatifs à la racine du transfert) ne fonctionnent pas directement car les répertoires parents doivent également être inclus. Sinon, la structure entière du répertoire est déjà exclue et le fichier ou le sous-répertoire recherché n'est jamais traité. Le manuel le dit (quelque part) mais c'est très contre-intuitif.

Afin de n'inclure que certains sous-répertoires, tous les répertoires parents doivent être inclus et tous leurs autres sous-répertoires doivent ensuite être exclus à nouveau :

include sub/
include sub/dir/
include sub/dir/I/
include sub/dir/I/want/***
exclude sub/*
exclude sub/dir/*
exclude sub/dir/I/*

include other/
include other/sub/
include other/sub/dir/
include other/sub/dir/I/
include other/sub/dir/I/want/***
exclude other/*
exclude other/sub/*
exclude other/sub/dir/*
exclude other/sub/dir/I/*

...

protect .hg*
exclude /*

L'avant-dernière ligne protège tous les .hg* et des fichiers comme .hg/ y .hgtags . La ligne exclut tous les autres répertoires de la racine du transfert.

J'ai écrit un script Perl pour produire le fichier de filtrage ci-dessus à partir de la liste des sous-répertoires souhaités. Il est accessible sous http://www.perlmonks.org/?node_id=928357 .

0voto

James Mertz Points 390

Exécutez rsync deux fois.

rsync hostname::sub/dir/I/want/        ./sub/dir/I/want/
rsync hostname::other/sub/dir/I/want/  ./other/sub/dir/I/want/

2 votes

J'ai plus de 2000 sous-répertoires que je veux, donc ce n'est pas une option.

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