GNU/Linux >> Linux Esercitazione >  >> Linux

Utilizzando le opzioni di inclusione ed esclusione di Rsync per includere directory e file in base al modello

Ecco la mia risposta "insegna a una persona a pescare":

La sintassi di Rsync è decisamente non intuitiva, ma vale la pena comprenderla.

  1. Per prima cosa, usa -vvv per vedere le informazioni di debug per 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 *

Il concetto chiave qui è che rsync applica i modelli di inclusione/esclusione per ciascuna directory in modo ricorsivo. Non appena il primo include/exclude viene abbinato, l'elaborazione si interrompe.

La prima directory che valuta è /Storage/uploads . Storage/uploads ha 1280000000/, 1260000000/, 1270000000/ directory/file. Nessuno di loro corrisponde a file_11*.jpg includere. Tutti corrispondono a * escludere. Quindi vengono esclusi e rsync termina.

  1. La soluzione è includere tutte le directory (*/ ) primo. Quindi il primo componente dir sarà 1260000000/, 1270000000/, 1280000000/ poiché corrispondono a */ . Il prossimo componente dir sarà 1260000000/ . In 1260000000/ , file_11_00.jpg corrisponde a --include="file_11*.jpg" , quindi è incluso. E così via.
$ 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


Il problema è che --exclude="*" dice di escludere (ad esempio) il 1260000000/ directory, quindi rsync non esamina mai il contenuto di quella directory, quindi non nota mai che la directory contiene file che sarebbero stati abbinati al tuo --include .

Penso che la cosa più vicina a quello che vuoi sia questa:

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

(che includerà tutte le directory e tutti i file corrispondenti a file_11*.jpg , ma nessun altro file) o forse questo:

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

(stesso concetto, ma molto più selettivo riguardo alle directory che includerà).


rsync include esempi di pattern di esclusione:

"*"         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...

E la nota finale è che semplicemente non fare affidamento sugli asterischi che vengono utilizzati all'inizio per valutare i percorsi; come "**dir" (va bene usarli per singole cartelle o file ma non per percorsi) e nota che più di due asterischi non funzionano per i nomi dei file.


Linux
  1. Filtro Rsync:copiare un solo pattern?

  2. trova e copia il file usando Bash

  3. Crea un file zip e ignora la struttura della directory

  4. rsync usando regex per includere solo alcuni file

  5. Utilizzo di sed per sostituire uno schema specifico

Collabora su un file usando Linux diff e patch

Come escludere file e directory con Rsync

Come copiare file e directory in Linux

Come eseguire il backup di file e directory utilizzando Rsync in Linux

Buona combinazione di riga di comando e browser di file grafico?

Gestisci le autorizzazioni di directory e file con chmod Recursive