我正在研究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 | --fuzzy
rsync 选项。除此之外,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
这会将以下更改从源目录传播到目标目录(或以下任意组合):
- 文件修改时间戳发生变化
- 重命名文件/目录
- 将文件从一个目录移动到另一个目录
使用此工具可以避免因重命名目录而导致传输 GB 大小的文件的可怕情况。
免责声明:我是上述工具的作者
答案4
你不能。
Rsync 有三种模式,
- 复制所有文件
- 复制现有(已修改/未修改)文件 - 在这方面你有很多选择
- 复制不存在的文件。
然而这三种模式又有两个子类别,
- 排除于
- 包括
Rsync 不会跟踪哪些文件被重命名,它没有状态。考虑复制全部文件,并排除您不想要。你不能有一个不断变化的白名单,但你可以有一个黑名单。
rsync [..stuff..] --exclude 'lib/'