Rsync 過濾器:僅複製一種模式
我正在嘗試創建一個目錄,該目錄將容納所有且僅包含從 LaTeX 編譯的 PDF。我喜歡將每個項目保存在一個單獨的文件夾中,所有項目都放在一個名為
LaTeX
. 所以我嘗試執行:rsync -avn *.pdf ~/LaTeX/ ~/Output/
它應該找到所有的pdf
~/LaTeX/
並將它們傳輸到輸出文件夾。這行不通。它告訴我找不到“~/
我的主目錄的完整路徑替換,但這沒有效果。我正在使用zsh。我嘗試在 bash 中做同樣的事情,甚至使用列出每個子目錄中每個文件的過濾器……這裡發生了什麼?
為什麼 rsync 不理解我的僅 pdf 過濾器?
好的。所以更新:不,我正在嘗試
rsync -avn --include="*/" --include="*.pdf" LaTeX/ Output/
這給了我整個文件列表。我猜是因為一切都符合第一個模式……
TL,博士:
rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/
Rsync 將源複製到目標。如果您
因此,您需要執行
rsync -a ~/LaTeX/ ~/Output/
,但使用過濾器告訴 rsync
包含和排除:
- 按名稱或位置排除文件很容易:
--exclude=*~
,--exclude=/some/relative/location
(相對於源參數,例如,這不包括~/LaTeX/some/relative/location
)。- 如果您只想匹配幾個文件或位置,請包含它們,包含通向它們的每個目錄(例如,使用
--include=*/
),然後使用 排除其餘的--exclude='*'
。這是因為:- 如果您排除一個目錄,這將排除它下面的所有內容。根本不會考慮排除的文件。
- 如果包含目錄,則不會自動包含其內容。在最近的版本中,
--include='directory/***'
將這樣做。- 對於每個文件,都會應用第一個匹配規則(包括從未匹配的任何內容)。
圖案:
- 如果模式不包含 a
/
,它適用於文件名 sans 目錄。- 如果模式以 結尾
/
,則它僅適用於目錄。- 如果模式以 開頭
/
,則它適用於作為參數傳遞給 的目錄的整個路徑rsync
。*
單個目錄組件的任何子字元串(即從不匹配/
);**
匹配任何路徑子字元串。如果源參數以 a 結尾,
/
則複製其內容(為每個rsync -r a/ b
創建)。否則目錄本身被複製(創建)。b/foo``a/foo``rsync -r a b``b/a
因此,在這裡我們需要包含
rsync -a --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/
請注意,這會複製所有目錄,甚至包括不包含匹配文件的目錄或包含匹配文件的子目錄。使用該選項可以避免這種情況
--prune-empty-dirs
(這不是通用解決方案,因為即使明確匹配目錄,您也無法複製目錄,但這是一個罕見的要求)。rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/