[英]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 的語法絕對不直觀,但值得理解。
-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/uploads
有1280000000/, 1260000000/, 1270000000/
目錄/文件。 它們都不匹配要包含的file_11*.jpg
。 所有這些都匹配*
以排除。 所以它們被排除在外,rsync 結束。
*/
)。 那么第一個目錄組件將是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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.