在Mac OS终端中按设定的时间批量更改文件创建日期



短背景

我买了一个路由器,正在安装。看起来,当我插入NAS时,路由器还没有设置好,所以";创建";所有文件的时间都提前了大约20年(即路由器开始时假设年份是2000年,而实际上是2020年末)。不管怎样,我有一堆10多年后的文件

目标

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

当前进度

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

touch -t YYYYMMDDhhmm THE_FILE

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

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的结果计算得出的,并从每个文件的当前创建日期中减去一组秒数

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

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

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

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

最新更新