GNU/Linux >> Znalost Linux >  >> Linux

Pomocí možností Rsync zahrnout a vyloučit zahrnout adresář a soubor podle vzoru

Zde je moje odpověď „naučte člověka rybařit“:

Syntaxe Rsync rozhodně není intuitivní, ale stojí za to ji pochopit.

  1. Nejprve použijte -vvv zobrazíte informace o ladění pro 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 *

Klíčovým konceptem je, že rsync rekurzivně aplikuje vzory zahrnout/vyloučit pro každý adresář. Jakmile dojde ke shodě prvního zařazení/vyloučení, zpracování se zastaví.

První adresář, který vyhodnotí, je /Storage/uploads . Storage/uploads1280000000/, 1260000000/, 1270000000/ dirs/soubory. Žádný z nich neodpovídá file_11*.jpg zahrnout. Všechny odpovídají * Vyloučit. Jsou tedy vyloučeni a rsync končí.

  1. Řešením je zahrnout všechny adresáře (*/ ) První. Pak bude první komponenta dir 1260000000/, 1270000000/, 1280000000/ protože odpovídají */ . Další komponenta dir bude 1260000000/ . V 1260000000/ , file_11_00.jpg odpovídá --include="file_11*.jpg" , takže je součástí. A tak dále.
$ 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


Problém je v tom, že --exclude="*" říká vyloučit (například) 1260000000/ adresář, takže rsync nikdy nezkoumá obsah tohoto adresáře, takže si nikdy nevšimne, že adresář obsahuje soubory, které by odpovídaly vašemu --include .

Myslím, že nejblíže tomu, co chcete, je toto:

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

(což bude zahrnovat všechny adresáře a všechny soubory odpovídající file_11*.jpg , ale žádné jiné soubory), nebo možná toto:

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

(stejný koncept, ale mnohem vybíravější, pokud jde o adresáře, které bude obsahovat).


rsync zahrnout příklady vzorů vyloučení:

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

A poslední poznámka je, že se jednoduše nespoléhejte na hvězdičky, které se používají na začátku pro hodnocení cest; jako "**dir" (je v pořádku je použít pro jednotlivé složky nebo soubory, ale ne cesty) a všimněte si, že více než dvě hvězdičky nefungují pro názvy souborů.


Linux
  1. Nástroje správce systému:Používání nástroje rsync ke správě zálohování, obnovy a synchronizace souborů

  2. Filtr Rsync:Kopírování pouze jednoho vzoru?

  3. 6 rsync Příklady k vyloučení více souborů a adresářů pomocí exclude-from

  1. najít a zkopírovat soubor pomocí Bash

  2. Jak použít příkaz 'cp' k vyloučení konkrétního adresáře?

  3. Vytvořte soubor zip a ignorujte strukturu adresářů

  1. Lomítka a příkaz rsync

  2. rsync pomocí regulárního výrazu k zahrnutí pouze některých souborů

  3. grep dvojice vzorů a souboru