我有一个使用的设置rsync
镜像一些来源目录到(远程)目的地除了一些定义了 rsync 排除模式的文件和位置:
# Useless files
- thumbs.db
- *.~
- *.tmp
- /*/.cache
- /*/.local/share/trash
# Already rsynced somewhere
- .dropbox
# Medias files
- *.avi
- *.mkv
- *.wav
- *.mp3
- *.bmp
- *.jpg
# System files
- /hiberfil.sys
- /pagefile.sys
该脚本在 Windows 和 Linux 工作站上运行并使用--delete
参数来从目标目录中删除无关文件。
问题是,当我“更新”排除模式(例如,为 Ogg 文件添加排除模式*.ogg
:)时,我必须重新运行 rsync 以从目标中删除任何现有的 Ogg 文件。
我想知道是否可以轻松地在给定目录上应用排除规则(有些规则可能很复杂,因为它使用通配符),这样我就不必从源重新运行 rsync 来清理目标目录。
到目前为止,我已经了解了以下使用基本名称匹配删除文件和目录的内容:
dirToClean="/var/somedir"
excludeFile="file_to_exclude"
# Delete files and dir of $dirToClean whose basename matches an exclude pattern from $excludeFile
for fileToDelete in $(grep --extended-regexp "^- .*" $excludeFile | sed 's/^- \(.*\)$/\1/'); do
find "$dirToClean" -iname "$fileToDelete" -exec rm {} \;
done
也许我可以使用与源和目标相同的目录来运行 rsync?
答案1
不要这样做。尝试在不使用 rsync 的情况下复制 rsync 包含/排除模式的功能是一个非常糟糕的主意。事实上,某些模式可能很复杂,因此更有理由不要尝试它。使用 rsync 本身来保证一致的行为并最大限度地减少意外情况。
从 rsync 手册页:
--存在,--忽略不存在
This tells rsync to skip creating files (including directories) that do not exist yet on the destination. If this option is combined with the --ignore-existing option, no files will be updated (which can be useful if all you want to do is to delete extraneous files).
因此,您应该使用 --delete --delete-excluded --ignore-existing --ignore-non-existing 运行,rsync 将删除无关文件,并且不会更新或删除任何其他文件。
答案2
遵循凯尔·琼斯的建议,使用可用的 rsync 选项来完成这项工作(而不是编码),我发现
rsync --include-from=file_to_exclude --recursive \
--delete-excluded \
/var/somedir/ /var/somedir/
工作得很好。我也尝试过--ignore-existing --ignore-non-existing --delete
在多个场景中使用,但结果与没有这 3 个选项时的结果相同。