我正在使用 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/