rsync copie du contenu du répertoire de manière non récursive


8

J'essaie de copier le contenu d'une série de répertoires de manière non récursive vers un autre système distant.

/dirA/dir1/file
/dirA/dir2/file
/dirA/dir3/file

dir1, dir2 et dir3 contiennent de nombreux répertoires que je ne souhaite pas copier. Copiez sur l'hôte distant vers / dirB en conservant la même structure de répertoires.

J'ai essayé:

rsync /dirA/*/ host:/dirB/
rsync /dirA/   host:/dirB/

Mais ils ne font pas ce que je veux.

Réponses:


20

rsync vous permet de spécifier des modèles qui déclenchent l'inclusion ou l'exclusion de fichiers et de répertoires. Je pense que vous voulez utiliser quelque chose comme ça:

rsync -a -f '- /*/*/' /dirA/ host:/dirB/

Explication:

  • -adéclenche le mode d'archivage qui active à la fois la récursivité et la préservation des "liens symboliques, appareils, attributs, autorisations, propriétés, etc.", selon man rsync.
  • -fest l'abréviation de --filter=, qui ajoute une règle de filtrage de fichiers.
    • Le modèle est à l'intérieur de guillemets simples afin que le shell ne développe pas les caractères génériques; les guillemets doubles fonctionneraient également bien dans ce cas.
    • - signifie qu'il s'agit d'un motif d'exclusion.
    • Le /début signifie que le modèle doit commencer à dirA/(le rsync "transfer-root").
    • La */*partie du modèle fait référence à tout ce qui se trouve à l'intérieur d'un sous-répertoire.
    • La fin /limite l'exclusion aux répertoires. Les fichiers à l'intérieur d'un sous-répertoire de dirA/ne sont pas affectés.

Donc au final, rsync ne copie rien de plus qu'un niveau (et ne crée pas non plus de répertoires de second niveau).


2
Très agréable! J'ai pu utiliser -f '- /*/'pour restreindre aux fichiers de niveau supérieur uniquement. J'ai également dû spécifier -f '- .*'d'exclure les fichiers de points, car je synchronisais un répertoire personnel.
haridsv

5

La solution ci-dessus (par PleaseStand) n'a pas fonctionné pour moi pour une raison quelconque. Cela a fonctionné cependant:

rsync -avc --no-r ./source/* ./destination/

Il y a aussi cette alternative:

rsync -avc --exclude "/" ./source/ ./destination/


1

L'une des "fonctionnalités" de rsync est la façon dont les répertoires sont analysés.

rsync /dirA/ host:/dirB/ et rsync /dirA host:/dirB devrait théoriquement être équivalent.

Comme vous ne voulez pas encourager la récursivité, vous voulez éviter -r, -ace qui implique en plus d'autres choses -r.

Je n'ai pas encore fini mes recherches, mais c'est ma réponse de départ.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.