要在保留文件修改日期的同时在 Mac 驱动器之间复制项目,请在终端中使用 macOS 的 ditto 命令并验证结果。但有一个重要的限制:ditto 的文档说明它会保留修改和访问时间,但不会保留原始文件创建日期。如果“日期”指的是访达(Finder)中的创建时间值,macOS 的官方复制选项并不保证保留该值。在删除源文件或重新格式化源驱动器之前,请确认哪个日期对你至关重要。
首先确定你需要保留的日期
文件的修改时间记录了其内容上次发生更改的时间。它的创建时间则是一个单独的文件系统属性。访达还可以显示添加日期,表示某个项目被添加到特定位置的时间。Apple 将创建日期和内容更改日期列为不同的文件系统元数据属性,因此保留了其中一个并不代表另一个也得到了保留。Apple 的文件系统元数据键
对于项目归档,修改时间通常是用于识别最后编辑版本的日期。如果你特别需要“创建时间”或“添加日期”——例如,因为另一个工作流程按该字段对文件进行排序——请将其视为一项单独的需求。切勿仅仅因为修改时间得以保留就推断创建时间也完好无损。
使用 ditto 复制项目
对于新的目标文件夹,请连接两个驱动器并打开终端。将示例中的宗卷和文件夹名称替换为访达中显示的实际名称。目标文件夹中不应已经包含你需要保留的项目副本:ditto 可以合并到现有目标中,并会覆盖同名文件。
ditto -V "/Volumes/SourceDrive/Project" "/Volumes/BackupDrive/Project"
这会将项目文件夹的内容复制到名为 Project 的目标文件夹中;-V 会打印每个已复制的项目。macOS 的 ditto 手册指出,复制的项目会保留源文件的修改和访问时间,并且默认会保留资源分叉(resource forks)和扩展属性。但在其承诺保留的时间戳中,并未列出创建时间。DITTO(1),macOS 手册页
如果目标文件夹已存在,ditto 会将源内容合并进去。当需要全新且干净的副本时,请使用全新的、命名正确的目标文件夹,并在依赖结果之前检查命令的输出是否存在错误。不要随意添加 --norsrc:手册指出该参数会禁用资源分叉的复制,并且除非被替换覆盖,还会同时禁用扩展属性和 ACL 的复制。这些属性对于 Mac 项目文件可能非常重要。
为什么 cp -p 不能解决创建日期问题
带有 -p 参数的内置 cp 命令可以在权限允许的情况下保留修改和访问时间以及其他属性。Apple 的 cp 手册同样没有在该列表中包含创建时间。这使得 cp -p 在你希望保留修改日期时很有用,但这并不是跨驱动器传递文件原始“创建时间”的官方支持方法。Apple 的 cp 手册
这两个命令都无法保证每个属性在每个目标位置都能完全一致地体现。驱动器的文件系统以及你账户所具备的权限会影响能够存储或应用的元数据。例如,ditto 的手册说明其仅在受支持的目标宗卷和权限下才会保留某些属性。
删除原始文件前务必验证
复制完成后,在访达中选中几个具有代表性的文件,然后按 Command-I 打开“显示简介”。比对源文件和目标文件的修改时间值;如果有需要,也可以比对创建时间。在访达的列表视图中,你可以查看可用的日期列并按其排序,不过 Apple 文档仅说明了列表视图显示修改日期,并没有保证所有日期字段都能保留。Apple 支持:在 Mac 上的“访达”中整理文件
检查项目中嵌套的文件以及顶层文件夹,并从目标位置打开关键的项目文件。如果修改时间匹配但创建时间已更改,则表明本次复制实现了文档所说明的时间戳保留,但未满足创建日期的保留需求。在你确认目标位置确实存在你所依赖的日期和项目内容之前,请完好保留源文件。
如果精确的“创建时间”至关重要,请务必在确认某种复制或归档工作流程明确支持为你所用的源和目标文件系统保留并恢复创建日期之后,再选择使用它。Apple 的 ditto 和 cp -p 文档并未做出此项承诺,因此不要将这两个命令视作该需求的验证解决方案。
参考来源
File System Metadata Attribute Keys — Apple Developer
DITTO(1) — macOS Manual Pages
cp(1) — Apple Open Source
在 Mac 上的“访达”中整理文件 — Apple 支持