为什么使用“cp -a”不能保留创建时间?

为什么使用“cp -a”不能保留创建时间?

我复制了一些目录,-a以便preserve=all我理解其中包括创建时间:

cp -a ./* /mnt/destination/

检查目标中的结果目录时,它们的创建时间都设置为当前时间,而它们的内容似乎保留了它们的创作时间。

为什么不是创建日期顶层目录保留吗?

源是 HFS+,目标是 btrfs。


目的地和来源的目录列表摘录:

$ ls -hal --time=creation
total 16K
drwxrwxr-x 1 andreas andreas   74 sep  2 23:25  .
drwx------ 1 andreas andreas  310 apr 26 17:08  ..
drwx------ 1 andreas andreas 2,3K sep  2 23:45  Library

$ ls -hal --time=creation /mnt/source
total 8,1M
drwxrwxr-x  1 andreas andreas   15 mar 28  2022  .
drwxr-x---+ 3 root    root    4,0K aug  9  2022  ..
drwx------  1 andreas andreas   95 apr 15  2019  Library

更新

从答案和评论来看,我得出的结论是,当我检查子目录的日期时,我一定犯了一个错误。我做到了。我的错——我对结果的期望蒙蔽了我的视线。问题的这一部分已被删除。

答案1

传统的unix文件系统没有创建时间,只有ctime。时间是改变时间,而不是创建时间。更改时间无法通过操作系统调用设置,除非将其更改为当前时间。更改权限或更改 atime 或 mtime 会将 ctime 设置为当前时间。

话虽如此,似乎尽管创建时间不是 POSIX 的一部分,但许多文件系统似乎都添加了它,请参阅Linux 上的哪些文件系统存储创建时间?

但是,即使对于支持它的文件系统,它也不是标准化的,因此不能保证 POSIX 工具中对创建时间的支持,并且即使在支持它的文件系统上,也可能无法设置它。如果您看到它有时设置,有时设置不正确,或者设置不一致,则可能涉及多个具有不同支持的工具,或者这些工具仅提供部分支持。

linux特定statx函数调用支持atime、btime、ctime和mtime,其中时间被标记为创建时间。然而,这只是读取时间。 (请注意,各种文件系统以各种方式引用创建时间,包括出生时间、btime、crtime 和 otime。)

深入挖掘,gnu coreutils cp 通过函数调用记录设置时间utimensat,该函数声称符合 POSIX-1.2008。本次调用仅支持修改阿泰姆时间但是研究这个,我无法确定这是否是因为 POSIX 仅支持 atime 和 mtime (ctime 不可设置),或者是否是因为 ctime 和 btime 基本上都是不可变的,仅允许操作系统进行更改,将它们设置为适当事件的当前时间。

答案2

唯一可以设置为任意值(使用utime()utimes()utimensat()futimens()系统调用)的时间戳是最后修改时间又名时间和上次访问时间又名阿泰姆。

改变状态时间又名 ctime 和诞生/创造时间(btime/crtime) 无法支持的地方伪造的(任意设置),因此cp -a,与任何其他软件一样,无法创建出生时间与其创建时间相对应的文件。

执行ln foo barinplacecp foo bar或使用-lGNU 选项cp将导致与bar具有相同的时间戳(包括创建时间)foo,但请注意,在这种情况下,foobar是同一文件(具有两个不同的名称)。

相关内容