Rsync
使用 rsync 僅複製帶有 .mp3 文件的目錄
我正在嘗試僅將包含 .mp3 文件的文件夾複製到另一台設備。並且只有其中的 .mp3。結構如下所示:
Band/Year - Album/*.flac Band/Year - Album/*.txt Band/Year - Album/*.mp3 Band/Year - Album/covers Band/Year - Album/covers/*.jpg
我已經閱讀了大量的手冊和論壇,但無法解決我的問題。無論我做什麼,無論我如何試圖制定我想在複製中包含的內容,因為它被排除在外 - 它甚至消失了
--exclude=* --include=*
不會複製任何東西。我在另一個目錄上測試了它,即使沒有,該死的。
編輯:我嘗試無濟於事的清單:
rsync -rnv --exclude=** --include=*/ --include=*/*/ --include=*/*/*/ --include=*/*/*.mp3 "./Be'lakor" /media/moorindal/WALKMAN/MUSIC rsync -rnv --exclude=** --include=*/ --include=*/*/ --include=*/*/*/ --include=**.mp3 "./Be'lakor" /media/moorindal/WALKMAN/MUSIC rsync -rnv --exclude=** --include=*/ --include=*/* --include=**.mp3 "./Be'lakor" /media/moorindal/WALKMAN/MUSIC rsync -rnv --exclude=*/*/* --include=**.mp3 "./Be'lakor" /media/moorindal/WALKMAN/MUSIC rsync -rnv --exclude=*/*/*.* --include=**.mp3 "./Be'lakor" /media/moorindal/WALKMAN/MUSIC rsync -rnv --exclude='*/*/*.*' --include='*/*/*.mp3' "./Be'lakor" /media/moorindal/WALKMAN/MUSIC
首先,為什麼
--exclude=* --include=*
不起作用:因為第一個匹配規則適用。*
匹配所有內容,因此排除所有內容,並且 rsync 甚至不會嘗試任何文件的第二條規則。有關 rsync 過濾器的指南,請參閱Rsync 過濾器:僅複製一種模式。要包含
.mp3
文件,您需要rsync -a -m --include='*.mp3' --include='*/' --exclude='*'
即包括 MP3,包括所有目錄(如果不包括目錄,則不包括其中的任何文件)並排除其他所有內容。該
-m
選項 (aka--prune-empty-dirs
) 使 rsync 跳過不包含任何要複製的文件的目錄。但這不會包括與該文件位於同一目錄中的其他.mp3
文件。為此,您需要 shell 或其他工具的幫助。在 zsh 中,您可以將
.mp3
子目錄中的文件與匹配**/*.mp3
,然後使用歷史修飾符作為glob 限定符將結果轉換為包含.mp3
文件的目錄列表。rsync -a **/*.mp3(:h) /destination
如果您有太多目錄(或者更準確地說,如果它們的名稱的組合長度太大),這可能會破壞命令行限制。刪除重複項可能會有所幫助:
typeset -aU directories directories=(**/*.mp3(:h)) rsync -a $directories /destination
這並不能消除命令太長的風險,它只是減少了它。為消除風險,請使用
zargs
rsync 批量執行。autoload -U zargs typeset -aU directories directories=(**/*.mp3(:h)) do_rsync () { rsync -a $@ /destination; } zargs --max-chars=$(($(get_conf ARG_MAX) - 500)) -- $directories -- do_rsync