rsync 仅选定子目录

rsync 仅选定子目录

我想将我的音乐库的一部分从外部驱动器同步到我的音频播放器。

一般来说,比如说,有一个$来源$目标目录和文本文件$子目录包含相对于的子目录路径列表$来源我想专门(--delete)rsync到其中$目标保留其目录树结构(--相对)。

我的代码my_sync.sh如下所示:

rsync -rR --include-from=$subdirs --exclude="/*" --delete --delete-excluded $source/./ $target

然而,问题是,这只适用于直接位于下面的子目录$来源(/dir/*.mp3),而嵌套子目录(即/dir1/dir2/...)被省略。

答案1

我想出了以下解决方案。

# exclude system created files like .DS_Store, desktop.ini...
arg="-C
"

# project each "$path" to "/$path/**" and concat 'em all
while read line || [[ -n $line ]]; do
    arg+="+ /$line/**
"
done < $subdirs

# */ - includes each folder so that rsync traverses the whole tree,
# *  - excludes everything else
arg+="+ */
- *"

# -m - excludes "empty" dirs that we used to traverse the tree
echo "$arg" | rsync -rmhvn -f ". -" --delete-excluded --info=PROGRESS2 --size-only $source/./ "$target"

相关内容