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.

Felipe Alvarez
la source

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).

Veuillez vous lever
la source
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/

Andrei Pokrovsky
la source
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.

killermist
la source