Rsync da lista de arquivos, mas também excluir arquivos estranhos no destino

0

Estou usando o rsync para carregar meu mp3 player com música de um arquivo de texto e, como tal, gostaria de excluir arquivos estranhos que não estão incluídos na lista "arquivos de". (Diga se eu não quiser mais uma música em particular no player de música e removê-la das listas de reprodução.)

No entanto, simplesmente usar qualquer uma das opções de exclusão não parece funcionar (--delete, --delete-during, etc.) Eu tentei excluir todo o resto (--exclude="*. *"), mas que também não removeu arquivos estranhos do destino. O comando atual que estou usando é.

rsync -vi --ignore-existing --files-from="~/include.txt" ~ ~/TestFolder/

No começo, eu tinha usado todas as opções típicas de rsync (-aR etc, mas elas parecem não fazer nada ao sincronizar a partir de uma lista de arquivos), então eu as removi. E estou usando apenas alterações detalhadas e detalhadas para fins de teste, para que eu possa ver o que está acontecendo. Eu tentei adicionar -r com --delete, mas isso não funciona. Eu também tentei (--delete-excluded --exclude="*. *").

Alguma sugestão?

Eu suponho que eu poderia gerar uma lista de arquivos para excluir, em seguida, excluí-los especificamente ... mas não é isso que o rsync DEVE fazer?

    
por user2634928 14.06.2018 / 20:06

1 resposta

0

Depois de pesquisar um pouco mais, descobri que não posso fazer isso no rsync (pelo menos no rsync que está instalado no meu mac.)

No entanto, encontrei um script para fazer essencialmente isso. Você terá que mexer com caminhos e o que não, mas funciona.

Do usuário "cpbills" no link

#!/bin/bash                                                                 

playlist_path="/home/cpbills/.config/mpd/playlists"
playlist="${playlist_path}/${1}.m3u"
music_src="/home/cpbills/files/music"
music_dst="/mnt/sdcard/music/"

if [[ -e "$playlist" ]]; then
  # Remove old files
  find "$music_dst" -type f | while read file; do
    name="$(echo "$file" | sed -e "s!^$music_dst!!")"
    if ! grep -qF "$name" "$playlist"; then
      rm "$file"
    fi
  done

  # Remove empty directories
  find "$music_dst" -type d -exec rmdir {} \; 2>/dev/null

  rsync -vu \
      --inplace \
      --files-from="$playlist" \
      "$music_src" "$music_dst"
else
  printf "%s does not exist\n" "$playlist" 1>&2
  exit 1
fi
Pessoalmente, eu dobrei a linha "remover diretórios vazios" porque, como o script acima fica, ele só remove uma camada de diretórios vazios. Portanto, se você tiver / Folder1 / Folder2 / Folder3 e executar o comando, ainda terá / Folder1 / Folder2 /. Se você executá-lo duas vezes, você terá / Folder1 /

    
por 14.06.2018 / 21:26