web-dev-qa-db-fra.com

Comment rsync uniquement une liste spécifique de fichiers?

J'ai environ 50 fichiers dans divers sous-répertoires que j'aimerais envoyer à un serveur distant. J'ai pensé que rsync serait capable de le faire pour moi en utilisant l'option --include-from. Sans l'option --exclude = "*", tous les fichiers du répertoire sont en cours de synchronisation. Avec l'option, aucun fichier ne l'est.

rsync -avP -e ssh --include-from=deploy/rsync_include.txt --exclude=* ./ [email protected]:/var/www/ --dry-run

J'exécute initialement à l'état sec et 0.0.0.0 est évidemment remplacé par l'adresse IP du serveur distant. Le contenu de rsync_include.txt est une nouvelle liste de chemins d'accès relatifs aux fichiers que je veux télécharger, séparés par une ligne.

Y a-t-il une meilleure façon de faire cela qui m'échappe un lundi matin?

55
Dan Steele

Vous aurez peut-être plus de facilité, si vous recherchez une liste spécifique de fichiers, placez-les directement sur la ligne de commande:

# rsync -avP -e ssh `cat deploy/rsync_include.txt` [email protected]:/var/www/

Ceci suppose toutefois que votre liste n’est pas si longue que la longueur de la ligne de commande pose problème et que le fichier rsync_include.txt ne contient que des chemins réels (c.-à-d. Aucun commentaire ni expression régulière).

3
Wes Hardaker

Il existe un indicateur --files-from qui fait exactement ce que vous voulez. De man rsync:

--files-from=FILE

L'utilisation de cette option vous permet de spécifier la liste exacte des fichiers à transférer (lue dans le FICHIER spécifié ou - pour l'entrée standard). Cela modifie également le comportement par défaut de rsync pour faciliter le transfert des fichiers et répertoires spécifiés:

  • L'option --relative (-R) est implicite, ce qui préserve les informations de chemin spécifiées pour chaque élément du fichier (utilisez --no-relative ou --no-R si vous souhaitez désactiver cette option).

  • L'option --dirs (-d) est implicite, ce qui créera les répertoires spécifiés dans la liste de la destination plutôt que de les ignorer bruyamment (utilisez --no-dirs ou --no-d si vous souhaitez désactiver cette option).

  • Le comportement de l’option --archive (-a) n’implique pas --recursive (-r), donc spécifiez-le explicitement, si vous le souhaitez.

  • Ces effets secondaires changent l’état par défaut de rsync, aussi la position de l’option --files-from sur la ligne de commande n’a aucune incidence sur la manière dont les autres options sont analysées (par exemple, -a fonctionne de la même manière avant ou après --files- de, comme --no-R et toutes les autres options).

Les noms de fichiers lus à partir du fichier sont tous relatifs au répertoire source. Toute barre oblique est supprimée et aucune référence ".." ne peut être supérieure au répertoire source. Par exemple, prenez cette commande:

rsync -a --files-from=/tmp/foo /usr remote:/backup

Si/tmp/foo contient la chaîne "bin" (ou même "/ bin"), le répertoire/usr/bin sera créé en tant que/backup/bin sur l'hôte distant. S'il contient "bin /" (remarquez la barre oblique), le contenu immédiat du répertoire sera également envoyé (sans qu'il soit nécessaire de le mentionner explicitement dans le fichier - cela a commencé à la version 2.6.4). À la fois Dans certains cas, si l’option -r était activée, l’ensemble de la hiérarchie de ce répertoire serait également transféré (n’oubliez pas que -r doit être spécifié explicitement avec --files-from, car il n’est pas impliqué par -a). Notez également que l’effet de l’option (activée par défaut) --relative consiste à dupliquer uniquement les informations de chemin lues à partir du fichier - le fichier ne force pas la duplication du chemin source-spec (/ usr dans ce cas).

De plus, le fichier --files-from peut être lu à partir de l'hôte distant au lieu de l'hôte local si vous spécifiez un "hôte:" devant le fichier (l'hôte doit correspondre à une extrémité du transfert). En tant que raccourci, vous pouvez uniquement spécifier un préfixe ":" pour "utiliser l'extrémité distante du transfert". Par exemple:

rsync -a --files-from=:/path/file-list src:/ /tmp/copy

Cela copierait tous les fichiers spécifiés dans le fichier/path/file-list qui se trouvait sur l'hôte "src" distant.

Si les options --iconv et --protect-args sont spécifiées et que les noms de fichiers --files-from sont envoyés d’un hôte à un autre, les noms de fichiers sont traduits du jeu de caractères de l’hôte émetteur vers le jeu de caractères de l’hôte récepteur.

REMARQUE: le tri de la liste des fichiers dans l'entrée --files-from permet à rsync d'être plus efficace, car cela évitera de revoir les éléments de chemin partagés entre les entrées adjacentes. Si l'entrée n'est pas triée, il est possible que certains éléments de chemin (répertoires implicites) soient analysés plusieurs fois, et que rsync les dédupliquera éventuellement après ils sont transformés en éléments de liste de fichiers.

145
atp

Le paramètre --files-from= nécessite une barre oblique finale si vous souhaitez conserver le chemin absolu intact. Donc, votre commande deviendrait quelque chose comme ci-dessous:

rsync -av --files-from=/path/to/file / /tmp/

Cela peut être fait comme s'il y avait un grand nombre de fichiers et que vous voulez copier tous les fichiers dans x path. Donc, vous trouveriez les fichiers et jetteriez la sortie dans un fichier comme ci-dessous:

find /var/* -name *.log > file
8
Waqas Khan

Pour mémoire, aucune des réponses ci-dessus n'a aidé sauf une. Pour résumer, vous pouvez effectuer l'opération de sauvegarde en utilisant --files-from= en utilisant:

  rsync -aSvuc `cat rsync-src-files` /mnt/d/rsync_test/

OU 

  rsync -aSvuc --recursive --files-from = rsync-src-files. /mnt/d/rsync_test/

L'ancienne commande est explicite, à côté du contenu du fichier rsync-src-files que je détaillerai plus bas. Maintenant, si vous voulez utiliser cette dernière version, vous devez garder à l’esprit les quatre remarques suivantes:

  1. Remarquez qu'il faut spécifier à la fois --files-from et le répertoire source
  2. Il faut spécifier explicitement --recursive
  3. Le fichier rsync-src-files est un fichier créé par l'utilisateur et il a été placé dans le répertoire src pour ce test.
  4. Le rsyn-src-files contient les fichiers et les dossiers à copier et ils sont pris par rapport au répertoire source. IMPORTANT: Assurez-vous qu'il n'y a pas d'espaces de fin ou de lignes vierges dans le fichier. Dans l'exemple ci-dessous, il n'y a que deux lignes, pas trois (Figure-le par hasard). Le contenu de rsynch-src-files est:

folderName1
folderName2

3
K F

J'ai une tâche similaire: rsynciser tous les fichiers modifiés après une date donnée, mais en excluant certains répertoires. Il était difficile de créer un style de doublure tout-en-un, j'ai donc plongé le problème en morceaux plus petits. Solution finale:

find  ~/sourceDIR -type f -newermt "DD MMM YYYY HH:MM:SS" | egrep -v "/\..|Downloads|FOO" > FileList.txt
rsync -v --files-from=FileList.txt ~/sourceDIR /Destination

J'utilise d'abord find -L ~/sourceDIR -type f -newermt "DD MMM YYYY HH:MM:SS". J'ai essayé d'ajouter regex à la ligne find pour exclure les modèles de noms, mais mon style de Linux (Mint) semble ne pas comprendre nier regex dans find. Nombre de saveurs de regex essayées - ne fonctionne pas comme vous le souhaitez. Je me retrouve donc avec egrep -v - une option qui exclut le motif de manière simple. Mon rsync ne copie pas les répertoires tels que /. Cache ou /. Config plus quelques autres que j'ai explicitement nommés.

1
sopel
$ date
  Wed 24 Apr 2019 09:54:53 AM PDT
$ rsync --version
  rsync  version 3.1.3  protocol version 31
  ...

Syntaxe: rsync <file_/_folder_list> <source> <target>

Dossier noms (ici, AVEC un / de formation; par exemple Cancer - Evolution/) sont dans un fichier de liste de dossiers (par exemple: cm_folder_list_test):

# /mnt/Vancouver/projects/ie/claws/data/cm_folder_list_test
# test file: 2019-04-24
Cancer/
Cancer - Evolution/
Cancer - Genomic Variants/
Cancer - Metastasis (EMT Transition ...)/
Cancer Pathways, Networks/
Catabolism - Autophagy; Phagosomes; Mitophagy/
Catabolism - Lysosomes/

Si vous n'incluez pas ces / de fin, les dossiers cibles rsync sont créés mais sont vides.

Ces noms de dossier sont ajoutés au reste de leur chemin (/home/victoria/Mail/2_RESEARCH - NEWS), fournissant ainsi le chemin d'accès complet du dossier à rsync; Exemple: /home/victoria/Mail/2_RESEARCH - NEWS/Cancer - Evolution/.

Notez que vous devez également utiliser --files-from= ..., NOT --include-from= ...

rsync -aqP --delete --files-from=/mnt/Vancouver/projects/ie/claws/data/cm_folder_list_test "/home/victoria/Mail/2_RESEARCH - NEWS" $IN/

(Dans mon script BASH, j'ai défini la variable $IN comme suit.)

BASEDIR="/mnt/Vancouver/projects/ie/claws"
IN=$BASEDIR/data/test/input

Options rsync utilisées:

 -a  :   archive: equals -rlptgoD (no -H,-A,-X)
    -r  :   recursive
    -l  :   copy symlinks as symlinks
    -p  :   preserve permissions
    -t  :   preserve modification times 
    -g  :   preserve group 
    -o  :   preserve owner (super-user only) 
    -D  :   same as --devices --specials 
  -q  :   quiet (https://serverfault.com/questions/547106/run-totally-silent-rsync)

  --delete
    This  tells  rsync to delete extraneous files from the RECEIVING SIDE (ones
    that AREN’T ON THE SENDING SIDE), but only for the directories that are
    being synchronized.  You must have asked rsync to send the whole directory
    (e.g.  "dir" or "dir/") without using a wildcard for the directory’s contents
    (e.g. "dir/*") since the wildcard is expanded by the Shell and rsync thus
    gets a request to transfer individual files, not the files’ parent directory.
    Files  that  are  excluded  from  the transfer are also excluded from being
    deleted unless you use the --delete-excluded option or mark the rules as
    only matching on the sending side (see the include/exclude modifiers in the
    FILTER RULES section).  ...
0
Victoria Stuart

Cette réponse n'est pas la réponse directe à la question . Mais elle devrait vous aider à déterminer quelle solution convient le mieux à votre problème.

Lors de l'analyse du problème, vous devez activer l'option de débogage -vv

Ensuite, rsync affichera les fichiers inclus ou exclus par quel modèle:

building file list ... 
[sender] hiding file FILE1 because of pattern FILE1*
[sender] showing file FILE2 because of pattern *
0
Matthias M