J'ai un fichier texte contenant une liste de répertoires avec son chemin absolu
$ cat DirectoriesToCopy.txt
/data/Dir1
/data/Dir2
Je veux utiliser rsync pour copier tous ces répertoires en préservant son chemin absolu vers un autre emplacement.
J'ai essayé la commande rsync suivante, mais cela ne fonctionne pas
rsync -avr --include-from=DirectoriesToCopy.txt --exclude='*/' --exclude='/*' / /media/MyDestination/
Qu'est-ce qui ne va pas ici?
/data/Dir1
et/data/Dir2
inclure leur contenu vers/media/MyDestination/Dir1
et/media/MyDestination/Dir2
? Ou voulez-vous inclure la/data
pièce? Quelle est la taille de cette liste, est-elle trop grande pour simplement lister ces entrées sur la ligne de commande? Quoi qu'il en soit, vos--exclude
déclarations empêchent la récursivité./media/MyDestination/data/Dir2/
. J'ai ajouté --exclude pour empêcher la copie d'autres répertoires et fichiers dans /.rsync -av $(cat DirectotiesToCopy.txt) /media/MyDestination/
Réponses:
Utilisez la commande suivante:
Vous devez inclure / data / explicitement, vous auriez également pu l'ajouter à la liste du fichier. Ensuite, excluez tous les autres répertoires (l'ordre est important avec les inclusions / exclusions).
Notez que votre utilisation de
-r
était redondante car elle est incluse dans-a
.EDIT: Vous pouvez également obtenir le même résultat avec:
Ce n'est pas rsync qui vous oblige à faire des choses difficiles juste pour copier quelques répertoires, il vous donne simplement plusieurs façons de faire la même chose; dans certains cas, le chemin d'inclusion / exclusion peut être plus adapté, ici je ferais la chose - relative ci-dessus (sans
--relative
vous vous retrouveriez avec/media/MyDestination/Dir1
et/media/MyDestination/Dir2
, avec le--relative
chemin source entier est copié vers la destination).la source
rsync -av --relative $(cat DirectotiesToCopy.txt) /media/MyDestination/
--relative
est juste une autre option.N'utilisez pas
--include
ou des--filter
variations, car cela ne fera que confondre les choses. Utilisez plutôt--files-from=_filename_
. (Si vous le faites, assurez-vous de faire beaucoup de tests.)Créez la liste des répertoires dans un fichier, un répertoire / fichier par ligne.
Utilisez rsync
--files-from=
avec le fichier ci-dessus.Utilisez l' option
--relative
/-R
pour vous assurer que les chemins d'accès source sont copiés à la fin de la destination.Même si vous en avez la
-a
possibilité, incluez également-r
. Depuis la page de manuel:Commande complète:
(les fichiers dans list_of_files.txt doivent être relatifs ou trouvés dans le répertoire de niveau supérieur )
(si DEBUG est défini, rsync affiche simplement ce qui aurait pu être copié.)
la source
--include-from
fonctionnera également, mais ce que j'ai dit-r
est en grande partie hors de propos.Le manuel rsync met en garde contre ce scénario (section «Inclure / exclure les règles de modèle»):
Dans votre cas, je pense que l'approche la plus simple serait de prétraiter la liste des répertoires à inclure afin que chaque fois que vous incluez
/path/to/foo
, inclure également tous les répertoires parents (/path/to
,/path
,/
), et comprennent également les sous - répertoires des répertoires originaux (/path/to/foo/***
), et après tout cela a une règle qui exclut tout ce qui n'est pas répertorié précédemment (*
).la source