mpdプレイリストの再同期

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

ファイル名にワイルドカード文字の1つが含まれていると*?[複雑になります。これらの文字の前にはバックスラッシュを追加する必要があります。ファイル名にバックスラッシュがある場合は、前にバックスラッシュが必要ですが、他のワイルドカードがある場合にのみ可能です。以下は、ファイル名のリストを予想される形式に変換する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

おすすめ記事