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

jmi*_*zas 36 rsync

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

rsync -zvru --bwlimit=1024  /mymounts/test1/ /mymounts/test2
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

小智 30

您可能想查看-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.
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果使用 `--fuzzy`,您应该考虑将其与 `--delete-delay` 结合使用,因为 *"rsync 默认情况下会执行 `--delete-before`,因此在它可以被删除之前删除基础文件复制/移动”*。来源:[索尼娅·汉密尔顿](http://www.snowfrog.n​​et/2011/03/03/fuzzy-rsync/) (11认同)
  • 您可能还需要 --delay-updates,我可以一起使用 `--fuzzy --delay-updates --delete-delay` 来不复制重命名的目录 (3认同)
  • [注意](https://unix.stackexchange.com/a/620080/59989):将`/test/10GBfile`重命名为`/test/otherdir/10GBfile_newname`仍然会重新发送数据,因为它不在同一目录。 (3认同)

小智 27

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"
Run Code Online (Sandbox Code Playgroud)

在 GitHub 上一个示例脚本。但是我建议您在生产中使用这种方法之前进行大量测试。


Man*_*ath 8

这是一个设计为在运行 之前工作的工具: rsync-sidekickrsync

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

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

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

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