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


26

我正在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

Answers:


23

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

我们最终得到了一个简单的解决方案,该解决方案在source / target目录中创建了一个包含硬链接的隐藏树,基本脚本可能如下所示:

# 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上一个示例脚本。但是我建议您在将这种方法用于生产之前进行大量测试。


您链接到的“精彩解释”也指的是这篇很棒的基本rsync文章,FWIW。everythinglinux.org/rsync
JakeGould 2014年

19

您可能需要查看-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.

7
请注意,如果使用--fuzzy,则应考虑将其与耦合--delete-delay,因为“默认情况下rsync会执行a --delete-before,因此在可复制/移动基础文件之前将其删除”。来源:索尼娅·汉密尔顿
罗南·乔谢

1

你不能

Rsync具有三种模式,

  • 复制所有文件
  • 复制现有(已修改/未修改)文件-在此文件上,您有很多选择
  • 复制不存在的文件。

但是,这三种模式有两个子类别,

  • 排除在
  • 包括在

Rsync不跟踪重命名的文件,它没有状态。考虑改为复制所有文件,并排除不需要的文件。您不能拥有白名单转移,也可以拥有黑名单。

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

谢谢您的输入,必须与重命名的文件一起使用。
jmituzas 2013年

您可以让它删除不存在的文件,这很好。但是作为复制的功能,如果您在源上重命名,它将复制重命名的文件。
埃文·卡罗尔

我可以使用-b保留版本并设置suffix =,date +%Y%m%d%k%M%S无论如何我都可以获取suffix = date +%Y%m%d%k%M%S.ORIGINALSUFFIX?
jmituzas

0

据我所知,rsync无法识别文件重命名新文件将不得不再次传输。参见artyom的答案。

要删除消失的文件,请确保使用--delete选项。

另外,对于镜像,我建议您使用-aarchive),这是一些不错的选项的别名。

请查看中的man 1 rsync详细信息。


谢谢,它将起作用--delete / mymounts / test1 / / mymounts / test2 /
jmituzas 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.