bash - 在 Mac OS 终端中按设定的时间批量更改文件创建日期
问题描述
简短的背景故事
我买了一个路由器,正在设置它。似乎当我插入我的 NAS 时,路由器还没有完成设置,所以所有文件的“创建”时间都被推迟了大约 20 年(即路由器开始时假设年份是2000 年,实际上是 2020 年末)。无论如何,所以,我有一堆未来 10 年以上的文件。
目标
使用 Mac OSX 的终端(我仍然配置为使用bash
shell 而不是 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
正确地将所有这些命令嵌套到一行中。
解决方案
一个 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 ''
推荐阅读
- javascript - 一般更新模式d3,删除旧数据
- c# - 在 MailKit 中使用 GMail OAuth2.0 进行身份验证的正确方法是什么?
- angular - Angular - 在离子卡中显示一个数字
- linux-kernel - wait_event 和锁的交互
- mysql - 合并 3 个表的所有 MySQL 语句
- python - 参数曲线的长度(曲线微分的积分)
- sql - 列的 PostgreSQL 级联(不是外键)
- python - 在导入之前模拟一个类
- scikit-learn - 第一次使用 tfidf,在每个条目都有一个列表的 Pandas 系列中使用它
- c# - 使用 C# 使用 .NET Framework HttpWebRequest 自定义代理服务器标头