处理 rsync 中重命名的文件或目录

处理 rsync 中重命名的文件或目录

我正在研究rsync用于目录复制的脚本。我让它只同步新的和修改过的文件或目录,但我不喜欢它将重命名的文件或目录复制为新文件或目录,从而使文件不同步。我还设置了 1MB 的带宽限制,因为这将在工作时间内运行。

这是我的脚本:

rsync -zvru --bwlimit=1024  /mymounts/test1/ /mymounts/test2

如果有人重命名某些文件但仍然只复制新的或修改过的文件,我该如何保持文件和目录同步?

以下是相关文件:

ls "/mymounts/test1/some stuff"
new directory  newfile1.txt  newfile3.txt  renamedFile.txt

ls "/mymounts/test2/some stuff"
new directory  newfile1.txt  newfile2.txt  newfile3.txt  renamedFile.txt

或者有没有办法将重命名的文件移动到另一个目录,比如:/mymounts/VerControl

答案1

您可能需要查看-y | --fuzzyrsync 选项。除此之外,rsync 没有办法跟踪重命名,因此您最终会传输重命名的文件。

来自 rsync 手册页:

   -y, --fuzzy
          This option tells rsync that it should look for a basis file for
          any  destination  file  that  is missing.  The current algorithm
          looks in the same directory as the destination file for either a
          file  that  has  an identical size and modified-time, or a simi-
          larly-named file.  If found, rsync uses the fuzzy basis file  to
          try to speed up the transfer.

答案2

rsync如果源目录和目标目录上的文件系统支持硬链接,则可以使用 来处理移动和重命名的文件。这个想法是让 rsync 在实际传输之前重建硬链接。您可以找到这里有一个精彩的解释

我们最终得到了一个简单的解决方案,即在源/目标目录内创建一个隐藏的硬链接树,基本脚本可能是这样的:

# Name of hidden directory
Shadow=".rsync_shadow"

# do real sync
rsync -ahHv --stats --no-inc-recursive --delete --delete-after "$Source"/ "$Target"

# update/create hidden dir of hard links in source
rsync -a --delete --link-dest="$Source" --exclude="/$Shadow" "$Source"/ "$Source/$Shadow"

# update/create hidden dir of hard links in target
rsync -a --delete --link-dest="$Target" --exclude="/$Shadow" "$Target"/ "$Target/$Shadow"

我有GitHub 上的示例脚本。但我建议您在将此方法用于生产之前进行大量测试。

答案3

这是一个专门设计来工作的工具 rsync运行: rsync-sidekick

这会将以下更改从源目录传播到目标目录(或以下任意组合):

  1. 文件修改时间戳发生变化
  2. 重命名文件/目录
  3. 将文件从一个目录移动到另一个目录

使用此工具可以避免因重命名目录而导致传输 GB 大小的文件的可怕情况。

免责声明:我是上述工具的作者

答案4

你不能。

Rsync 有三种模式,

  • 复制所有文件
  • 复制现有(已修改/未修改)文件 - 在这方面你有很多选择
  • 复制不存在的文件。

然而这三种模式又有两个子类别,

  • 排除于
  • 包括

Rsync 不会跟踪哪些文件被重命名,它没有状态。考虑复制全部文件,并排除您想要。你不能有一个不断变化的白名单,但你可以有一个黑名单。

rsync [..stuff..] --exclude 'lib/'

相关内容