rsync更改修改日期的错误,即使使用-a选项也是如此


3

我一直在测试rsync,并在将文件和文件夹从分区复制到另一个分区时发现了一个奇怪的错误:

如果我这样做:

rsync -avE --delete '/Volumes/disk1/origin/' '/Volumes/disk2/destination/'

它正确复制/同步。

下次我使用rsync进行相同的同步时,文件中的某些修改日期(不是文件夹!)会变得不正确(更改为当前日期和时间),即使我已经使用了 -a 在里面 rsync 应该保留它的命令。

最奇怪的是,如果我重做它,那么错误的日期现在是正确的,这意味着rsync每隔一次运行就会改变修改日期,当它改变日期时,它始终是相同的文件,我没有看到除了影响文件和相同文件之外的模式。

我做错了什么,可以修复吗?

这是使用OS X 10.9.5,使用终端rsync 2.6.9


1
这两卷上的文件系统是什么? 脂肪 有一个臭名昭着的设计问题,修改时间只能以2秒的分辨率表示。 rsync并不总能很好地处理这个问题。
Chris Harrington

@ChrisHarrington都使用Mac OS Extended(Journaled),并使用标准的GUID分区表。
jackJoe

3
看评论 这里 rsync 2.6.9在修改时有一个已知错误 - 获取更新版本
Mark

@Mark我怀疑rsync可能需要更新,我已经为测试做了更新(更新到3.1.0版本),但创建日期(在这个新版本的情况下)不会保留...所以部分问题解决了,现在我有一个新问题。也许我需要使用不同的选项而不仅仅是 -avE
jackJoe

@jackJoe创建日期总是在文件获取新的inode时更改(嗯,hfs中的目录节点ID)。我假设您正在运行64位内核,在这种情况下应保留生育时间。你自己编译rsync了吗?
fd0

Answers:


1

让我更正我的评论:64位时间戳由 access-modification-change-birthtime

man 2 stat 以下系统调用会更改相应的时间。

struct stat的时间相关字段如下:

 st_atime         Time when file data last accessed.  Changed by the mknod(2), utimes(2) and read(2) system calls.

 st_mtime         Time when file data last modified.  Changed by the mknod(2), utimes(2) and write(2) system calls.

 st_ctime         Time when file status was last changed (inode data modification).  Changed by the chmod(2), chown(2), link(2), mknod(2), rename(2),
                  unlink(2), utimes(2) and write(2) system calls.

 st_birthtime     Time of file creation. Only set once when the file is created. This field is only available in the 64 bit inode variants. On filesys-
                  tems where birthtime is not available, this field holds the ctime instead.

工具如 cpditto,和 pax 可以在调用OS X元数据以复制文件时保留它们。如果修改时间比原始文件的出生时间更新,这些工具将无法保留出生时间。新文件的生成时间设置为原始文件的修改时间。

如果使用patchflags,crtimes,hfs-compression编译rsync,则rsync可以处理OS X元数据并保留原始文件在新文件上的生成时间。

所以,你会像这样调用rsync。

rsync -avXN --delete SOURCE DESTINATION

我建议您长时间阅读rsync手册,并在尝试应用之前了解我建议的选项。


按照您的建议和本教程升级rsync selfsuperinit.com/2014/01/04/... 我用了 rsync -avXN --delete SOURCE DESTINATION 它工作得很好,所有修改日期,创建日期等都保留,所以问题解决了,谢谢!
jackJoe

-N不是一种选择。你是说 - 干跑吗?但是,这仍然不适合我。带有rsync 3.1.2的macOS Sierra 10.12(手动更新)。目标上的创建日期是在源上复制修改日期。
lukejanicke

@ lukejanicke-您是否应用了我提到的补丁?如果你这样做了 -N 选项应该可用。从 rsync -h-N, --crtimes preserve create times (newness)
fd0

@jackJoe您分享的链接已损坏。我以为它只是一个升级教程。我手动升级到rsync 3.1.2并且选项中仍然没有-N。该教程是否包含除升级说明之外的其他内容?
lukejanicke

我找到了这个 romej.com/2016/04/rsync-backups-on-os-x 这解释了如何包含补丁,我没有意识到它们是分开的。
lukejanicke
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.