gpt4 book ai didi

linux - Rsync with --checksum 从本地到本地?

转载 作者:IT王子 更新时间:2023-10-29 00:36:22 31 4
gpt4 key购买 nike

我会先尝试定位问题。我们有一个构建为大型文件树的项目。该构建有数百 MB,包含许多(较小的)文件,其中只有一小部分在构建之间发生变化。我们希望保留这些构建的一些历史记录,并且为了有效地做到这一点,我们希望硬链接(hard link)在构建之间不会更改的文件。为此,我们使用 rsync(作为 cp 的更强大的兄弟),使用选项 --link-dest 从本地源到本地目标> 用于执行硬链接(hard link)魔术。

这适用于增量构建:大多数文件未被触及,rsync 正确执行硬链接(hard link)技巧。使用完全重新编译构建(出于与此处无关的原因我们必须这样做),事情似乎没有按预期工作。由于重新编译,所有文件都获得了新的时间戳,但就内容而言,大多数文件仍与之前的构建相同。但即使我们使用 rsync--checksum 选项(所以 rsync “同步”/基于内容的硬链接(hard link),而不是文件大小+时间戳) , 不再有任何硬链接(hard link)。

插图

我试图用这个简单的 (bash) 脚本来隔离/说明问题:

echo "--- Start clean"
rm -fr src build*

echo "--- Set up src"
mkdir src
echo hello world > src/helloworld.txt

echo "--- First copy with src as hardlink reference"
rsync -a --checksum --link-dest=$(pwd)/src src/ build1/

echo "--- Second copy with first copy as hardlink reference"
rsync -a --checksum --link-dest=$(pwd)/build1 src/ build2/

echo "--- Result (as expected)"
ls -ali src/helloworld.txt build*/helloworld.txt

echo "--- Sleep to have reasonable timestamp differences"
sleep 2

echo "--- 'Remake' src, but with same content"
rm -fr src/helloworld.txt
echo hello world > src/helloworld.txt

echo "Third copy with second copy as hardlink reference"
rsync -a --checksum --link-dest=$(pwd)/build2 src/ build3
# Using --modify-window=10 gives results as expected
# rsync -a --modify-window=10 --link-dest=$(pwd)/build2 src/ build3

echo "Final result, not as expected"
ls -ali src/helloworld.txt build*/helloworld.txt

第一个结果如预期:所有三个副本都是硬链接(hard link)的(相同的 inode)

30157018 -rw-r--r--  3 stefaan  staff  12 May 10 01:28 build1/helloworld.txt
30157018 -rw-r--r-- 3 stefaan staff 12 May 10 01:28 build2/helloworld.txt
30157018 -rw-r--r-- 3 stefaan staff 12 May 10 01:28 src/helloworld.txt

最终结果不符合预期/期望:

30157018 -rw-r--r--  2 stefaan  staff  12 May 10 01:28 build1/helloworld.txt
30157018 -rw-r--r-- 2 stefaan staff 12 May 10 01:28 build2/helloworld.txt
30157026 -rw-r--r-- 1 stefaan staff 12 May 10 01:28 build3/helloworld.txt
30157024 -rw-r--r-- 1 stefaan staff 12 May 10 01:28 src/helloworld.txt

第三个副本 build3/helloworld.txt 没有硬链接(hard link)到 build2 中的副本,即使内容相同,所以校验和检查应该看到这个。

问题

有人知道这里出了什么问题吗?我的期望错了吗?或者 rsync 在从本地同步到本地时是否忽略了 --checksum 选项,例如因为它知道查看 inode 编号比花时间在校验和上更聪明?

最佳答案

问题是使用“-a”标志会强制保留修改时间(隐含地,“-t”)。

如果您改用“-rlpgo”(或在“-a”之后加上“--no-times”),修改时间将不再被考虑保存,因此 inode 将被共享。您仍然必须指定“--size-only”或“--checksum”(后者显然更安全),这样它就不会根据文件时间进行比较。

文档没有明确区分哪些标志用于触发更新,哪些用于控制属性的保存

关于linux - Rsync with --checksum 从本地到本地?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10525748/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com