J'ai environ 50 fichiers dans divers sous-répertoires que je voudrais pousser vers 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 synchronisés, 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
Je l'exécute aussi sec au départ 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 relatifs séparés par une ligne vers les fichiers que je souhaite télécharger.
Y a-t-il une meilleure façon de faire cela qui m'échappe un lundi matin?
rsync --files-from
c'est probablement une solution plus simple et plus fiable :)Il y a un drapeau
--files-from
qui fait exactement ce que vous voulez. Deman rsync
:la source
rsync -av --files-from=file-list . target/
pour copier des fichiers depuis le répertoire courant.The filenames that are read from the FILE are all relative to the source dir
...
rsync semble ignorer le..
me donnant une erreur commersync: link_stat "/home/michael/test/subdir/test.txt" failed: No such file or directory
(dans ce cas, courir à partir du répertoire "test" et essayer de spécifier "../subdir/test.txt" qui existe.--files-from
argument peut-il être combiné avec une liste explicite d'inclusions et d'exclusions, et les fichiers de la liste ajoutés avec--files-from
remplacer les règles d'exclusion existantes, de sorte qu'ils soient inclus s'ils apparaissent dans le fichier?--files-from=
Le paramètre nécessite une barre oblique finale si vous souhaitez conserver le chemin absolu intact. Ainsi, votre commande deviendrait quelque chose comme ci-dessous:Cela pourrait être fait comme s'il y avait un grand nombre de fichiers et que vous vouliez copier tous les fichiers vers x path. Vous trouverez donc les fichiers et lancez la sortie dans un fichier comme ci-dessous:
la source
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
--files-from=
en utilisant soit:OU
La première commande est explicite, à côté du contenu du fichier
rsync-src-files
que je développerai ci-dessous. Maintenant, si vous souhaitez utiliser cette dernière version, vous devez garder à l'esprit les quatre remarques suivantes:--files-from
et le répertoire source--recursive
.rsync-src-files
est un fichier créé par l'utilisateur et il a été placé dans le répertoire src pour ce testrsyn-src-files
contient les fichiers et 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 vides dans le fichier. Dans l'exemple ci-dessous, il n'y a que deux lignes, pas trois (déterminez-le par hasard). Le contenu dersynch-src-files
est:folderName1
folderName2
la source
J'ai eu une tâche similaire: rsynchroniser tous les fichiers modifiés après une date donnée, mais en excluant certains répertoires. Il était difficile de construire un seul style de doublure tout-en-un, alors j'ai plongé le problème en plus petits morceaux. Solution finale:
J'utilise d'abord
find -L ~/sourceDIR -type f -newermt "DD MMM YYYY HH:MM:SS"
. J'ai essayé d'ajouterregex
à lafind
ligne pour exclure les modèles de nom, mais ma saveur de Linux (Mint) semble ne pas comprendre l'expression régulière de négationfind
. Nombre d'essais de saveurs regex - ne fonctionne pas comme souhaité. Donc, je me retrouve avecegrep -v
- option qui exclut le modèle de manière simple. Myrsync
ne copie pas des répertoires comme /.cache ou /.config ainsi que d'autres que j'ai explicitement nommés.la source
bash
seule ligne:rsync -v --files-from=<(find ~/sourceDIR -type f -newermt "DD MMM YYYY HH:MM:SS" | grep -Ev "/\..|Downloads|FOO") ~/sourceDIR /Destination
Syntaxe:
rsync <file_/_folder_list> <source> <target>
Les noms de dossier (ici, AVEC une fin
/
; par exempleCancer - Evolution/
) sont dans un fichier de liste de dossiers (par exemple: cm_folder_list_test):Si vous n'incluez pas ces
/
derniers, les dossiers cibles rsync'd 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 complet du dossier vers rsync; par exemple:/home/victoria/Mail/2_RESEARCH - NEWS/Cancer - Evolution/
.Notez que vous devez également utiliser
--files-from=
..., PAS--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.)Options rsync utilisées:
la source
Cette réponse n'est pas la réponse directe à la question. Mais cela devrait vous aider à déterminer la solution la mieux adaptée à votre problème.
Lors de l'analyse du problème, vous devez activer l'option de débogage
-vv
Ensuite, rsync affichera quels fichiers sont inclus ou exclus par quel modèle:
la source
Aucune de ces réponses n'a fonctionné pour moi, alors que je n'avais qu'une liste de répertoires . Puis je suis tombé sur la solution! Vous devez ajouter
-r
à--files-from
parce que-a
ne sera pas récursive dans ce scénario (qui savait ?!).la source