我正在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 | --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.
Run Code Online (Sandbox Code Playgroud)
小智 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 上有一个示例脚本。但是我建议您在生产中使用这种方法之前进行大量测试。
这是一个设计为在运行
之前工作的工具: rsync-sidekickrsync
这会将以下更改从源目录传播到目标目录(或以下任意组合):
使用此工具可以使您避免重命名目录导致传输 GB 文件的可怕情况。
免责声明:我是上述工具的作者
归档时间: |
|
查看次数: |
25839 次 |
最近记录: |