首页 > 解决方案 > 在 Mac OS 终端中按设定的时间批量更改文件创建日期

问题描述

简短的背景故事

我买了一个路由器,正在设置它。似乎当我插入我的 NAS 时,路由器还没有完成设置,所以所有文件的“创建”时间都被推迟了大约 20 年(即路由器开始时假设年份是2000 年,实际上是 2020 年末)。无论如何,所以,我有一堆未来 10 年以上的文件。

目标

使用 Mac OSX 的终端(我仍然配置为使用bashshell 而不是 zsh),我想动态修改具有不正确创建日期的文件以删除设定的时间。

目前的进展

通读另一个 SO 答案告诉我,以下内容将修改文件的创建日期。

touch -t YYYYMMDDhhmm THE_FILE

通过阅读一些手册页和另一个 SO question 的答案,我得到了以下命令来查找日期有问题的所有文件(在我的当前目录中)。

find . -type f -newermt '1/1/2025 00:00:00'

我还使用了第三个 SO 答案来进行一些调试,以确保我的日期数学是正确的。

date -r "$(expr $(stat -f %c THE_FILE) - 661361702)" +%Y%m%d%H%M

就我而言,661361702 被确定为“20 年 11 个月 15 天”(以秒为单位),即从 2000-01-01 00:00:00 到我设置路由器并弄乱日期的时间长度.

对于与我的条件匹配的一组文件find,我想用来touch修改创建日期,该日期是根据文件的结果计算得出的stat,每个文件的当前创建日期减去一组秒数。

我正在尝试将所有这些拼接在一起,但不知道如何正确使用-exec选项find正确地将所有这些命令嵌套到一行中。

标签: bashmacosfiledateunix

解决方案


一个 bash 循环,而不是试图将所有这些都放在 的exec操作中find,可能会简化脚本的编码:

find . -type f -newermt '1/1/2025 00:00:00' -print0 | \
while IFS= read -r -d '' f; do
    s=$(stat -f %c "$f")
    (( s -= 661361702 ))
    d=$(date -r "$s" +%Y%m%d%H%M)
    touch -t "$d" "$f"
done

注意:上面的解决方案使用 的-print0选项和( )find的空分隔符来用 NUL 字符分隔找到的文件名,而不是使用默认空格。这是健壮的,即使您的文件名带有换行符、制表符、空格......read-d ''


推荐阅读