Rsync:如果校验和相同,则保持目标文件不变

Rsync: Keep destination file unchanged if same checksum

假设我们有以下文件:

 ~/Homepage $ ls -l harp_output/BingSiteAuth.xml harp_netlify/BingSiteAuth.xml 
 -rw-r--r-- 1 david david 81 14. Mai 07:58 harp_netlify/BingSiteAuth.xml
 -rw-r--r-- 1 david david 81 14. Mai 08:10 harp_output/BingSiteAuth.xml

两个文件的内容相同:

~/Homepage $ cmp harp_output/BingSiteAuth.xml harp_netlify/BingSiteAuth.xml; echo $?
0

因此,我希望harp_netlify/BingSiteAuth.xml不要因为相同的内容而被更改。然而,使用以下命令,目标端文件的时间戳得到更新:

~/Homepage $ rsync -cav --delete harp_output/ harp_netlify/

结果是这样的:

~/Homepage $ ls -l harp_output/BingSiteAuth.xml harp_netlify/BingSiteAuth.xml 
-rw-r--r-- 1 david david 81 14. Mai <b>08:10</b> harp_netlify/BingSiteAuth.xml
-rw-r--r-- 1 david david 81 14. Mai 08:10 harp_output/BingSiteAuth.xml

但是,我想要这个:

~/Homepage $ ls -l harp_output/BingSiteAuth.xml harp_netlify/BingSiteAuth.xml 
-rw-r--r-- 1 david david 81 14. Mai <b>07:58</b> harp_netlify/BingSiteAuth.xml
-rw-r--r-- 1 david david 81 14. Mai 08:10 harp_output/BingSiteAuth.xml

但是,如果校验和不同,rsync 必须更新时间戳。

您传递给 rsync 的参数是 -cav;您遇到的问题是 "a",如 man page 中所述,它扩展为 -rlptgoD,给您留下传递给 rsync 的最终 -crlptgoDv 参数列表。

其中棘手的部分是 ptgo,它们保留权限 (p)、修改时间 (t) (这是导致当前示例中同步更改的原因)、组 (g) 和所有者 (o)。如果我没看错你的问题,你想要的是:

rsync -crlDv --delete harp_output/ harp_netlify/

在此我们保留您当前命令中的 "c" 和 "v",并使用 "r"(用于递归同步)、"l" 来保留符号链接, 和 "D" 来保存设备和特殊文件。如果你想要的只是基于校验和递归同步,而不关心链接或特殊文件,那么 "r" 就足够了;即:

rsync -crv --delete harp_output/ harp_netlify/