在给定目录上应用给定的 rsync 排除模式

在给定目录上应用给定的 rsync 排除模式

我有一个使用的设置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 个选项时的结果相同。

相关内容