短背景
我买了一个路由器,正在安装。看起来,当我插入NAS时,路由器还没有设置好,所以";创建";所有文件的时间都提前了大约20年(即路由器开始时假设年份是2000年,而实际上是2020年末)。不管怎样,我有一堆10多年后的文件
目标
使用Mac OSX的终端(我仍然将其配置为使用bash
shell和而不是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循环,而不是试图将所有这些都放在find
的exec
操作中,可能会简化脚本的编码:
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字符分隔找到的文件名,而不是默认的空格。这是稳健的,即使您的文件名带有换行符、制表符、空格。。。