Я использую rsync для загрузки моего mp3-плеера с музыкой из текстового файла, и поэтому я хочу удалить посторонние файлы, которые не включены в список «файлы из». (Скажите, если я больше не хочу конкретную песню на музыкальном проигрывателе, и удалите ее из списков воспроизведения.)

Однако простое использование любого из параметров удаления не работает (--delete, --delete-while и т.д.) Я пытался исключить все остальное (--exclude = "*. *"), Но это также не удаляло посторонние файлы из места назначения. Текущая команда, которую я использую:

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

Сначала я использовал все типичные параметры rsync (-aR и т.д., Но они, похоже, ничего не делают при синхронизации из списка файлов), поэтому я удалил их. И я просто использую подробные и детализированные изменения для целей тестирования, чтобы видеть, что происходит. Я попытался добавить -r с --delete, но это тоже не работает. Я также пытался (--delete-exclude --exclude = "*. *").

Какие-либо предложения?

Я полагаю, я мог бы создать список файлов для удаления, а затем специально удалить их ... но разве это НЕ ДОЛЖНО делать?

1 ответ1

0

После еще нескольких поисков я обнаружил, что не могу сделать это на rsync (по крайней мере на rsync, установленном на моем Mac).

Тем не менее, я нашел сценарий для этого. Вам придется возиться с путями, а что нет, но это работает.

От пользователя "cpbills" по адресу https://stackoverflow.com/questions/1813907/rsync-delete-files-from-list-dest-does-not-delete-unwanted-files

#!/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

лично я удвоил строку "удалить пустые каталоги", потому что, как показано в приведенном выше сценарии, он удалит только один слой пустых каталогов. Так что если у вас есть /Folder1 /Folder2 /Folder3 и вы запустите команду, у вас все равно будет /Folder1 /Folder2 /. Если вы запустите его дважды, у вас будет /Folder1 /

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .