跨系统迁移后macOS文件日期偏移:确定偏移量与修改方法
文件时间偏移量确定与修复方案
一、获取精确时间偏移量
通过已知实际日期的文件(如你提到的iTerm2-3_2_6.zip),用终端工具提取显示时间与实际时间的时间戳差值,即可得到精确偏移量:
提取AFP挂载文件的显示时间戳
在macOS终端中,用stat直接获取文件的UNIX时间戳(单位:秒):stat -f "%m" /Volumes/你的共享文件夹/iTerm2-3_2_6.zip或用
GetFileInfo获取macOS纪元时间(从2001-01-01起的秒数),再转换为UNIX时间戳:# 获取macOS纪元时间 MAC_TIMESTAMP=$(GetFileInfo -m /Volumes/你的共享文件夹/iTerm2-3_2_6.zip) # 转换为UNIX时间戳(2001-01-01对应的UNIX时间为978307200) UNIX_TIMESTAMP=$((MAC_TIMESTAMP + 978307200))获取实际日期的UNIX时间戳
已知实际日期为2019-01-21,终端中转换为UNIX时间戳:date -j -f "%Y-%m-%d" "2019-01-21" +"%s"计算精确偏移量
用显示时间的UNIX时间戳减去实际时间的UNIX时间戳,得到的差值就是精确偏移量(正数表示时间被推后,负数表示提前)。你的案例中,该差值约为630720000秒(即20年)。
二、用GetFileInfo/SetFile解析与修改文件时间
解析文件时间
GetFileInfo可直接读取macOS兼容的文件元数据时间:
- 获取修改时间(macOS纪元格式):
GetFileInfo -m /Volumes/共享文件夹/目标文件 - 获取创建时间:
转换为人类可读格式:GetFileInfo -c /Volumes/共享文件夹/目标文件date -j -f "%s" $(( $(GetFileInfo -m 目标文件路径) + 978307200 )) +"%Y-%m-%d %H:%M:%S"
批量修复文件时间
确定偏移量后(比如OFFSET=-630720000,即减去20年),用SetFile批量修正:
单个文件修复:
OFFSET=-630720000 # 替换为你的实际偏移量 CURRENT_TIMESTAMP=$(stat -f "%m" 目标文件路径) CORRECT_TIMESTAMP=$(( CURRENT_TIMESTAMP + OFFSET )) CORRECT_DATE=$(date -j -f "%s" $CORRECT_TIMESTAMP +"%m/%d/%Y %H:%M:%S") SetFile -m "$CORRECT_DATE" 目标文件路径文件夹批量修复:
OFFSET=-630720000 cd /Volumes/共享文件夹/目标目录 for file in *; do if [ -f "$file" ]; then CURRENT_TIMESTAMP=$(stat -f "%m" "$file") CORRECT_TIMESTAMP=$(( CURRENT_TIMESTAMP + OFFSET )) CORRECT_DATE=$(date -j -f "%s" $CORRECT_TIMESTAMP +"%m/%d/%Y %H:%M:%S") SetFile -m "$CORRECT_DATE" "$file" fi done注:
SetFile属于Xcode命令行工具,未安装可执行xcode-select --install获取。
三、可能的偏移原因分析
你的20年偏移既不是macOS与UNIX纪元的31年差,也不符合2038问题(32位时间戳溢出会跳转到1970年前),更可能是:
- 早期NFS复制时,工具错误地给文件时间加上20年偏移后存入ext4;
- Synology的AFP服务读取ext4旧文件时间元数据时,存在解析逻辑错误;
- 跨系统传输时,NFS/AFP协议对时间元数据的存储格式不兼容,累积产生偏移。
内容的提问来源于stack exchange,提问作者chronospoon
相关产品推荐
相关产品推荐

