Rsync

使用 rsync 僅複製帶有 .mp3 文件的目錄

  • April 6, 2019

我正在嘗試僅將包含 .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

這並不能消除命令太長的風險,它只是減少了它。為消除風險,請使用zargsrsync 批量執行。

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

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