rsync 一个 mpd 播放列表

rsync 一个 mpd 播放列表

mpd 播放列表如下所示:

同步文件.m3u

Bob Dylan - The Times They Are A-Changin' [V0]/04. One Too Many Mornings.mp3
Bob Dylan - The Times They Are A-Changin' [V0]/01. The Times They Are A-Changin'.mp3/

或者可以将其配置为存储完整路径:

同步完整.m3u

/home/share/media/audio/Bob Dylan - The Times They Are A-Changin' [V0]/01. The Times They Are A-Changin'.mp3
/home/share/media/audio/Bob Dylan - The Times They Are A-Changin' [V0]/03. With God On Our Side.mp3

我想将rsync这些文件保存到/media/sdg/MUSIC。如果文件从播放列表中删除,我希望它从目标位置删除文件。

我无法正确理解咒语。我以为昨晚已经成功了,但是当我重新运行时,它不起作用。我已经尝试了我能想到的include-from所有组合。exclude=*

答案1

以下是基本方法(见这个 rsync 过滤器指南了解更多信息):

  • 将文件包含在播放列表中;
  • 包含所有目录(否则不会复制任何内容),并排除其他所有内容;
  • 删除未同步的文件和空目录

因此(未经测试):

rsync -a --include-from=/path/to/syncrel.m3u --include='*/' --exclude='*' \
      --delete --delete-excluded --prune-empty-dirs \
      /home/share/media/audio/ /media/sdg/MUSIC

如果您的文件名可能包含通配符之一*?[,则会增加复杂性。您需要在这些字符前面加上反斜杠。如果文件名中也有反斜杠,则还需要在它们前面加上反斜杠,但前提是存在其他通配符。下面是一个 sed 片段,用于将文件名列表转换为预期格式(如果文件名中没有反斜杠,则只需要第一个表达式):

sed -e 's/[*?\[]/\\&/g' -e 's/[*?[]/&/' -e T -e 's/\\\\/\\/g'

在 bash、ksh 或 zsh 下,有一种方便的方法可以在将文件列表传递给 rsync 之前对其进行过滤:

rsync -a --include-from=<(</path/to/syncrel.m3u sed -e 's/[*?\[]/\\&/g') \
      --include='*/' --exclude='*' \
      --delete --delete-excluded --prune-empty-dirs \
      /home/share/media/audio/ /media/sdg/MUSIC

相关内容