Comment rsynciser un répertoire dans un nouveau répertoire avec un nom différent?

49

Je fais un transfert de données, l'ancien système de fichiers s'appuie fortement sur un répertoire qui est maintenant sur un chemin différent. Ceci est un répertoire git qui stocke le code en ligne. Je n'ai aucun droit de le déplacer ou de le renommer.

Donc, ce que je peux faire, c'est rsync de ce répertoire avec le même ancien chemin. Mais le nom du répertoire a également changé.

Existe-t-il un moyen simple de rynchroniser un répertoire dans un répertoire cible avec un nom différent?

Zen
la source

Réponses:

83

Si vous voulez utiliser rsyncpour faire de manière récursive le destrépertoire une copie exacte du srcrépertoire:

rsync -a src/ dest

La rsyncpage de manuel explique comment cela fonctionne:

Une barre oblique de fin sur la source évite [...] la création d'un niveau de répertoire supplémentaire sur la destination. Une fin /sur une source peut signifier "copier le contenu de ce répertoire" par opposition à "copier le répertoire par son nom" [...]

Adrian
la source
3
Cela créera un srcrépertoire sous destrépertoire
Zen
7
@Zen, pas dans aucune version de rsyncj'ai jamais utilisé. Si cela vous arrive réellement, vous manquez la barre oblique à la fin de l'argument du répertoire source.
Adrian
3
Ce slash de fuite sournois est la
clé
Malheureusement , cela ne semble pas fonctionner si destun symlnk à src, elle se termine à la place jusqu'à la copie srcà src/src. Testé sur macOS. J'espérais pouvoir remplacer bar -> foo/par bar/, mais je devais utiliser un répertoire temporaire intermédiaire.
user5359531
@ user5359531 Si vous savez qu'il dests'agit d'un lien symbolique vers src, simplement rm destavant d'exécuter la commande ci-dessus. rsyncest assez intelligent pour créer destavant de copier le contenu de src. Vous n'avez pas besoin d'un répertoire de temp intermédiaire.
Adrian
1

Si l'ancien et le nouveau système de fichiers sont tous deux accessibles à votre machine, envisagez d'utiliser un lien symbolique au lieu de rsync. Si votre commande rsync que vous utilisez ne spécifie pas les hôtes (ou s’il s’agit du même hôte), c’est le cas. Vous essayez de mettre en miroir deux répertoires avec un nom différent sur le même hôte. N'utilisez pas rsync pour cela, car vous dupliquez les données et vous devrez exécuter votre rsync souvent pour les synchroniser.

L'utilisation d'un lien symbolique est une solution ponctuelle qui met en miroir deux répertoires (avec des noms différents) et ne nécessite presque pas d'espace. C'est comme créer un répertoire d'alias qui pointe vers un autre répertoire.

Supposons que l'ancien git se trouve dans un répertoire appelé / old / path / old_git et que le référentiel de code a été déplacé vers / new / path / new_git.

Tu peux faire:

cd /old/path
rm -rf old_git     (if you still have it there, get rid of it, or move it out of the way)  
ln -s /new/path/new_git old_git

Cela créera un lien en tant que tel:

/ old / path / old_git -> / new / path / new_git

Ainsi, tout ce qui est mis dans new_git sera aussi instantanément disponible à l'ancienne, sans duplication des données et sans avoir à les synchroniser en permanence.

jrel
la source
1
Soyez prudent avec la commande rm -rf old_git. Cela supprimera tout votre référentiel old_git. Si je ne comprends pas bien votre problème, cela pourrait être une mauvaise chose.
Jrel
0

Je trouve une solution alternative maintenant.

Utiliser rysnc -r /origin/* /target/peut synchroniser tout le contenu du répertoire d'origine vers le répertoire cible.

Zen
la source
8
Je pense que cela n'inclut pas les fichiers point (.foo), car ceux-ci ne seront pas comparés à l'astérisque
Ray Burgemeestre
qui repose sur l’expansion globale du shell, techniquement, il transmettra chaque fichier trouvé là comme argument à rsync. c'est presque pareil que courir rsync -r $(find /origin -maxdepth 1 -type f) /target/ . Comme @RayBurgemeestre l'a fait remarquer, l'expansion globale du shell n'inclut pas les fichiers de points.
Florian Castellane