And*_*eas 3 filesystems cp timestamps
我复制了一些目录,-a以便preserve=all我理解其中包括创建时间:
cp -a ./* /mnt/destination/\nRun Code Online (Sandbox Code Playgroud)\n检查目标中的结果目录时,它们的创建时间都设置为当前时间,而它们的内容似乎保留了它们的创作时间。
为什么不是创建日期顶层目录保留吗?
源是 HFS+,目标是 btrfs。
\n目的地和来源的目录列表摘录:
\n$ ls -hal --time=creation\ntotal 16K\ndrwxrwxr-x 1 andreas andreas 74 sep 2 23:25 .\ndrwx------ 1 andreas andreas 310 apr 26 17:08 ..\ndrwx------ 1 andreas andreas 2,3K sep 2 23:45 Library\n\n$ ls -hal --time=creation /mnt/source\ntotal 8,1M\ndrwxrwxr-x 1 andreas andreas 15 mar 28 2022 .\ndrwxr-x---+ 3 root root 4,0K aug 9 2022 ..\ndrwx------ 1 andreas andreas 95 apr 15 2019 Library\nRun Code Online (Sandbox Code Playgroud)\n从答案和评论来看,我得出的结论是,当我检查子目录的日期时,我一定犯了一个错误。我做到了。我的错 \xe2\x80\x94 我对结果的期望蒙蔽了我所看到的东西。问题的这一部分已被删除。
\nuse*_*489 10
传统的unix文件系统没有创建时间,只有ctime。ctime 是更改时间,而不是创建时间。更改时间无法通过操作系统调用设置,除非将其更改为当前时间。更改权限或更改 atime 或 mtime 会将 ctime 设置为当前时间。
话虽如此,似乎尽管创建时间不是 POSIX 的一部分,但许多文件系统似乎都添加了它,请参阅Linux 上的哪些文件系统存储创建时间?
但是,即使对于支持它的文件系统,它也不是标准化的,因此不能保证 POSIX 工具中对创建时间的支持,并且即使在支持它的文件系统上,也可能无法设置它。如果您看到它有时设置,有时设置不正确,或者设置不一致,则可能涉及多个具有不同支持的工具,或者这些工具仅提供部分支持。
Linux特定statx函数调用支持atime、btime、ctime和mtime,其中btime标记为创建时间。然而,这只是读取时间。(请注意,各种文件系统以各种方式引用创建时间,包括出生时间、btime、crtime 和 otime。)
深入挖掘,gnu coreutils cp 通过utimensat函数调用记录设置时间,该函数声称符合 POSIX-1.2008。这个调用只支持修改atime和mtime,但是研究了一下,我无法确定这是因为POSIX只支持atime和mtime(ctime不可设置),还是因为ctime和btime基本上都是不可变的,仅允许更改操作系统,在适当的事件中将它们设置为当前时间。