从“files-from”列表进行 Rsync,但也删除目标中的无关文件

从“files-from”列表进行 Rsync,但也删除目标中的无关文件

我正在使用 rsync 将文本文件中的音乐加载到 mp3 播放器中,因此我想删除未包含在“文件来源”列表中的无关文件。(假设我不再需要音乐播放器上的某首歌曲,并将其从播放列表中删除。)

但是,仅仅使用任何删除选项似乎都不起作用(--delete、--delete-during 等)。我尝试排除其他所有内容(--exclude="*.*"),但这也没有从目标中删除无关文件。我当前使用的命令是。

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

起初,我使用了所有典型的 rsync 选项(-aR 等,但它们在从文件源列表同步时似乎不起作用),所以我删除了它们。而且,我只是出于测试目的使用详细和逐项更改,以便了解发生了什么。我尝试使用 --delete 添加 -r,但这也不起作用。我还尝试了(--delete-excluded --exclude="*.*")。

有什么建议么?

我想我可以生成一个要删除的文件列表,然后具体删除它们...但这不是 rsync 应该做的吗?

答案1

经过进一步搜索后,我发现我无法在 rsync 上执行此操作(至少在我的 Mac 上安装的 rsync 上无法执行此操作)。

不过,我确实找到了一个脚本来做这件事。虽然你得处理路径之类的事情,但它确实有效。

来自用户“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/

相关内容