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
- ...
- ...
- entreprise1
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
- ...
- entreprise1
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.
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
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='*'