GNU/Linux >> Tutoriels Linux >  >> Linux

Utilisation des options d'inclusion et d'exclusion de Rsync pour inclure le répertoire et le fichier par modèle

Voici ma réponse "apprendre à pêcher à quelqu'un":

La syntaxe de Rsync n'est certainement pas intuitive, mais elle mérite d'être comprise.

  1. Tout d'abord, utilisez -vvv pour voir les informations de débogage pour rsync.
$ rsync -nr -vvv --include="**/file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

[sender] hiding directory 1280000000 because of pattern *
[sender] hiding directory 1260000000 because of pattern *
[sender] hiding directory 1270000000 because of pattern *

Le concept clé ici est que rsync applique les modèles d'inclusion/exclusion pour chaque répertoire de manière récursive. Dès que la première inclusion/exclusion correspond, le traitement s'arrête.

Le premier répertoire qu'il évalue est /Storage/uploads . Storage/uploads a 1280000000/, 1260000000/, 1270000000/ répertoires/fichiers. Aucun d'eux ne correspond à file_11*.jpg inclure. Tous correspondent à * exclure. Ils sont donc exclus et rsync se termine.

  1. La solution consiste à inclure tous les répertoires (*/ ) première. Ensuite, le premier composant dir sera 1260000000/, 1270000000/, 1280000000/ puisqu'ils correspondent à */ . Le prochain composant dir sera 1260000000/ . En 1260000000/ , file_11_00.jpg correspond à --include="file_11*.jpg" , il est donc inclus. Et ainsi de suite.
$ rsync -nrv --include='*/' --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

./
1260000000/
1260000000/file_11_00.jpg
1260000000/file_11_01.jpg
1270000000/
1270000000/file_11_00.jpg
1270000000/file_11_01.jpg
1280000000/
1280000000/file_11_00.jpg
1280000000/file_11_01.jpg

https://download.samba.org/pub/rsync/rsync.1


Le problème est que --exclude="*" dit d'exclure (par exemple) le 1260000000/ répertoire, donc rsync n'examine jamais le contenu de ce répertoire, donc ne remarque jamais que le répertoire contient des fichiers qui auraient été mis en correspondance avec votre --include .

Je pense que la chose la plus proche de ce que vous voulez est la suivante :

rsync -nrv --include="*/" --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

(qui inclura tous les répertoires et tous les fichiers correspondant à file_11*.jpg , mais pas d'autres fichiers), ou peut-être ceci :

rsync -nrv --include="/[0-9][0-9][0-9]0000000/" --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

(même concept, mais beaucoup plus pointilleux sur les répertoires qu'il inclura).


rsync inclure des exemples de modèles d'exclusion :

"*"         means everything
"dir1"      transfers empty directory [dir1]
"dir*"      transfers empty directories like: "dir1", "dir2", "dir3", etc...
"file*"     transfers files whose names start with [file]
"dir**"     transfers every path that starts with [dir] like "dir1/file.txt", "dir2/bar/ffaa.html", etc...
"dir***"    same as above
"dir1/*"    does nothing
"dir1/**"   does nothing
"dir1/***"  transfers [dir1] directory and all its contents like "dir1/file.txt", "dir1/fooo.sh", "dir1/fold/baar.py", etc...

Et la note finale est que ne vous fiez tout simplement pas aux astérisques qui sont utilisés au début pour évaluer les chemins; comme "**dir" (il est possible de les utiliser pour des dossiers ou des fichiers uniques, mais pas pour des chemins) et notez que plus de deux astérisques ne fonctionnent pas pour les noms de fichiers.


Linux
  1. Outils d'administration système :utilisation de rsync pour gérer la sauvegarde, la restauration et la synchronisation des fichiers

  2. rechercher et copier un fichier à l'aide de Bash

  3. Comment utiliser la commande 'cp' pour exclure un répertoire spécifique ?

  4. grep paires de motifs et fichier

  5. Capture de STDERR et STDOUT dans un fichier à l'aide de tee

Collaborer sur un fichier en utilisant Linux diff et patch

Comment exclure des fichiers et des répertoires avec Rsync

Comment copier des fichiers et des répertoires sous Linux

Comment sauvegarder des fichiers et des répertoires à l'aide de Rsync sous Linux

Bonne combinaison de ligne de commande et de navigateur de fichiers graphique ?

Gérer les autorisations de répertoire et de fichier avec chmod Recursive