簡體   English   中英

使用 Rsync 包含和排除選項按模式包含目錄和文件

[英]Using Rsync include and exclude options to include directory and file by pattern

我在正確使用rsync語法時遇到了問題,我想知道我的場景是否真的可以用rsync處理。 首先,我已經確認rsync在我的本地主機和我的遠程主機之間工作得很好。 對目錄進行直接同步是成功的。

這是我的文件系統的樣子:

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

我想要做的是僅在子目錄中以“file_11_”開頭的文件上運行 rsync,並且我希望能夠僅運行一個 rsync 作業來同步子目錄中的所有這些文件。

這是我正在嘗試的命令:

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

這導致在我的試運行中標記了0文件以進行傳輸。 我已經嘗試了--include--exclude語句的各種其他組合,但要么繼續沒有結果,要么得到了一切,就好像沒有設置包含或排除選項一樣。

任何人都知道如何做到這一點?

問題是--exclude="*"說要排除(例如) 1260000000/目錄,因此rsync永遠不會檢查該目錄的內容,因此永遠不會注意到該目錄包含與您匹配的文件--include

我認為最接近你想要的是這個:

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

(這將包括所有目錄,以及與file_11*.jpg匹配的所有文件,但沒有其他文件),或者可能是這樣的:

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

(相同的概念,但對它將包含的目錄更加挑剔)。

rsync包括排除模式示例:

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

最后要注意的是,不要依賴一開始使用的星號來評估路徑; "**dir" (可以將它們用於單個文件夾或文件,但不能用於路徑)並注意兩個以上的星號不適用於文件名。

將 -m 添加到上面的推薦答案以修剪空目錄。

這是我“教人釣魚”的答案:

Rsync 的語法絕對不直觀,但值得理解。

  1. 首先,使用-vvv查看 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 *

這里的關鍵概念是 rsync 遞歸地為每個目錄應用包含/排除模式。 一旦第一個包含/排除匹配,處理就會停止。

它評估的第一個目錄是/Storage/uploads Storage/uploads1280000000/, 1260000000/, 1270000000/目錄/文件。 它們都不匹配要包含的file_11*.jpg 所有這些都匹配*以排除。 所以它們被排除在外,rsync 結束。

  1. 解決方案是首先包含所有目錄 ( */ )。 那么第一個目錄組件將是1260000000/, 1270000000/, 1280000000/因為它們匹配*/ 下一個目錄組件將是1260000000/ file_11_00.jpg 1260000000/file_11_00.jpg匹配file_11_00.jpg --include="file_11*.jpg" ,因此它被包含在內。 等等。
$ 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM