Copiez le lien symbolique ET où il pointe vers l'utilisation de rsync


11

Cela n'a pas besoin d'être fait par rsync, mais ce serait bien de ne pas avoir à écrire de script pour le faire, et rsyncc'est très proche de ce que je veux.

rsync -a(ou -l) peut conserver les liens symboliques, et -Ldéréférencer les liens symboliques et les copier comme s'il s'agissait d'un fichier / répertoire normal. Cependant, est-il possible de conserver le lien symbolique et de copier également les fichiers / répertoires vers lesquels les liens pointent?

Voici un exemple. Disons que nous avons cette hiérarchie de dossiers:

dirA/link_to_file -> ../dirB/file
dirA/link_to_dir -> ../dirC
dirB/file
dirB/not_this_file
dirC/file
dirC/file2
dirD/others

et quand je le fais rsync -aR dirA dest(ou autre chose), je voudrais que ceux-ci apparaissent exactement dans dest:

dirA/link_to_file -> ../dirB/file
dirA/link_to_dir -> ../dirC
dirB/file
dirC/file
dirC/file2

Est-ce possible avec rsync? Je vous remercie.

Supposons que les liens symboliques ayant un chemin absolu ou pointant vers l'extérieur du répertoire source puissent être ignorés.


1
Je pense que votre demande est sous-spécifiée: vous exigez que si dirA/linkest un lien symbolique vers ../dirB/file, alors cela doit être traité comme une copie dirB/filevers dest/dirB/fileet dirA/linkvers dest/dirA/link. Et si dirA/linkest un lien vers ../../another_file? Que se passe-t-il, en général, si dirA/linkpointe vers un répertoire plus haut dans l'arborescence des répertoires?
Riccardo Murri

Bonne prise. Dans mon cas d'utilisation, il n'y a pas de point de lien vers l'extérieur de l'arborescence et il n'y a pas de chemin absolu dans les liens.
Wei-Yin du

1
Plus j'y pense, plus je pense qu'aucun utilitaire standard ne le fera. Dans le cas général, il pourrait avoir besoin de créer un grand nombre de destinations données d' une source unique, si vous avez un lien symbolique vers un lien symbolique ou plus généralement un lien symbolique dont la cible contient un lien symbolique (par exemple a -> b, b -> c/foo, c -> d/e: une demande de copie adoit également copier b, c, c/foo, d, d/eet d/e/foo).
Gilles 'SO- arrête d'être méchant'

@ Gilles: Oui, vous avez raison. Le suivi des liens peut entraîner l'inclusion d'un grand nombre de fichiers, tant qu'ils se trouvent toujours dans le répertoire source.
Wei-Yin

Réponses:


2

Si vous connaissez le nom du lien symbolique et souhaitez transférer le lien et la cible, vous pouvez:

rsync -a 'symlink' .
realdir="$(basename "$(readlink -f 'symlink')")"
rsync -a "$realdir" .

Le premier rsynctransfère juste le symlink. La deuxième commande trouve le vrai nom de répertoire et la seconde rsynctransfère le contenu du répertoire.


0

Cela serait possible si et seulement si vous étiez tous dans 'mydir' et que vous deviez synchroniser 'mydir' d'un endroit à un autre. Rsync n'est pas capable de copier en dehors du chemin que vous lui donnez (à l'exception des liens suivants). par exemple

mydir/dirA ...
mydir/dirB ...
...

Oui, cette hypothèse correspond à mon cas d'utilisation. Tous les liens se trouvent dans mydir.
Wei-Yin

@ Wei-Yin alors dites-lui simplement de ne pas suivre les liens symboliques ... ou ai-je mal compris quelque chose
xenoterracide

@xenoterracide: Peu importe comment vous invoquez rsync, je pense que cela créera une destination unique pour chaque source (autre que la création de répertoires principaux). Mais Wei-Yin veut créer deux destinations ou plus: le lien et sa cible.
Gilles 'SO- arrête d'être méchant'

apparemment, je suis confus ...
xenoterracide

@Gilles: il n'est pas nécessaire que rsync suive le lien symbolique, car il synchronisera quand même la cible . Il copie donc d'abord le lien symbolique, créant un lien symbolique pendant. Ensuite, il continue à copier tout le reste du répertoire, y compris la cible du lien symbolique. Voila, tout s'accorde bien.
Martin c.Löwis
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.