rsync uma lista de reprodução do mpd

3

Uma lista de reprodução do mpd tem esta aparência:

syncrel.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/

Ou pode ser configurado para armazenar o caminho completo:

syncfull.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

Eu quero rsync desses arquivos para / media / sdg / MUSIC. Quero que ele exclua arquivos do destino se eles forem removidos da lista de reprodução.

Eu não consigo acertar o encantamento. Eu pensei que tinha na noite passada, mas quando eu reran, não funcionou. Eu tentei todas as combinações de include-from , exclude=* , etc. Eu posso pensar.

    
por tladuke 01.06.2011 / 10:20

1 resposta

3

Aqui está a abordagem básica (consulte este guia de filtro do rsync para mais informações):

  • inclua os arquivos na lista de reprodução;
  • inclua todos os diretórios (caso contrário, nada seria copiado) e exclua tudo o mais;
  • excluir arquivos não sincronizados e diretórios vazios

Assim (não testado):

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

Se os nomes dos seus arquivos contiverem um dos caracteres curinga *?[ , há uma complicação adicional. Você precisa preceder esses caracteres com uma barra invertida. E, se houver barras invertidas nos nomes de arquivos, você também precisará precedê-las com uma barra invertida, mas somente se houver outros curingas. Aqui está um snippet de sed para converter uma lista de nomes de arquivos para o formato esperado (você só precisa da primeira expressão se não houver barras invertidas nos nomes dos arquivos):

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

No bash, ksh ou zsh, há uma maneira conveniente de filtrar a lista de arquivos antes de passá-la para o 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
    
por 01.06.2011 / 10:38

Tags