Backup

Rsync 過濾器:僅複製一種模式

  • January 17, 2022

我正在嘗試創建一個目錄,該目錄將容納所有且僅包含從 LaTeX 編譯的 PDF。我喜歡將每個項目保存在一個單獨的文件夾中,所有項目都放在一個名為LaTeX. 所以我嘗試執行:

rsync -avn *.pdf ~/LaTeX/ ~/Output/

它應該找到所有的pdf~/LaTeX/並將它們傳輸到輸出文件夾。這行不通。它告訴我找不到“ *.pdf”的匹配項。如果我忽略此過濾器,該命令會列出 LaTeX 下所有項目文件夾中的所有文件。所以這是 *.pdf 過濾器的問題。我嘗試用~/​​我的主目錄的完整路徑替換,但這沒有效果。

我正在使用zsh。我嘗試在 bash 中做同樣的事情,甚至使用列出每個子目錄中每個文件的過濾器……這裡發生了什麼?

為什麼 rsync 不理解我的僅 pdf 過濾器?


好的。所以更新:不,我正在嘗試

rsync -avn --include="*/" --include="*.pdf" LaTeX/ Output/

這給了我整個文件列表。我猜是因為一切都符合第一個模式……

TL,博士:

rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/

Rsync 將源複製到目標。如果您*.pdf作為源傳遞,shell 會將其.pdf擴展為目前目錄中具有副檔名的文件列表。不會發生遞歸遍歷,因為您沒有將任何目錄作為源傳遞。

因此,您需要執行rsync -a ~/LaTeX/ ~/Output/,但使用過濾器告訴 rsync.pdf僅複製文件。當您閱讀手冊時,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


因此,在這裡我們需要包含*.pdf、包含包含它們的目錄,並排除其他所有內容。

rsync -a --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/

請注意,這會複製所有目錄,甚至包括不包含匹配文件的目錄或包含匹配文件的子目錄。使用該選項可以避免這種情況--prune-empty-dirs(這不是通用解決方案,因為即使明確匹配目錄,您也無法複製目錄,但這是一個罕見的要求)。

rsync -am --include='*.pdf' --include='*/' --exclude='*' ~/LaTeX/ ~/Output/

引用自:https://unix.stackexchange.com/questions/2161