web-dev-qa-db-fra.com

lire l'entrée d'un fichier et synchroniser en conséquence

J'ai un fichier texte qui contient la liste des fichiers et répertoires que je veux copier (un sur une ligne). Maintenant, je veux que rsync prenne cette entrée de mon fichier texte et la synchronise avec la destination que je fournis.

J'ai essayé de jouer avec "--include-from=FILE" et "--file-from=FILE" options de rsync mais cela ne fonctionne tout simplement pas

J'ai également essayé de pré-fixer "+" sur chaque ligne de mon fichier mais cela ne fonctionne toujours pas.

J'ai essayé de venir avec différents modèles de filtre comme indiqué dans la page de manuel rsync mais cela ne fonctionne toujours pas.

Quelqu'un pourrait-il me fournir la syntaxe correcte pour ce cas d'utilisation. J'ai essayé plus de choses sur Fedora 15, RHEL 6.2 et Ubuntu 10.04 et rien n'a fonctionné. Il me manque donc quelque chose.

Merci beaucoup.

36
slayedbylucifer

Il existe plusieurs façons de répondre à cette question selon la façon dont vous souhaitez copier ces fichiers. Si votre intention est de copier la liste des fichiers avec des chemins absolus, cela pourrait ressembler à ceci:

rsync -av --files-from=/path/to/files.txt / /destination/path/

... Cela supposerait que les chemins d'accès soient relatifs à l'emplacement source de / et conserverait toute la structure absolue sous cette destination.

Si votre objectif est de copier tous ces fichiers de la liste vers la destination, sans conserver aucun type de hiérarchie de chemins (juste une collection de fichiers), vous pouvez essayer l'une des méthodes suivantes:

# note this method might break if your file it too long and
# exceed the maximum arg limit
rsync -av `cat /path/to/file` /destination/

# or get fancy with xargs to batch 200 of your items at a time
# with multiple calls to rsync
cat /path/to/file | xargs -n 200 -J % rsync -av % /destination/

Ou une boucle for et une copie:

# bash Shell
for f in `cat /path/to/files.txt`; do cp $f /dest/; done
69
jdi

Étant donné une liste de fichiers $ HOME/GET/bringemback contenant

**need/A
alsoneed/B
shouldget/C**

cd $ HOME/GET

courir

rsync -av --files-from=./bringemback me@theremote:. $HOME/GET/collect

obtiendrait les fichiers et les déposerait dans $HOME/GET/collect

$HOME/GET/
          collect/
                  need/A
                  alsoneed/B
                  shouldget/C

ou alors je crois.

utile

6
helpful

rsync prend cela en charge de manière native:

rsync --recursive -av --files-from=/path/to/files.txt / /destination/path/

4
egafni