You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何在Mac OS Terminal(Bash环境)中批量减去固定时长修改文件创建日期

批量修正Mac Bash环境下文件的创建时间

我来帮你把这些零散的命令整合起来,实现单条命令批量修正异常文件的创建时间。先直接给你可用的最终命令,之后再拆解每个部分帮你理解:

find . -type f -newermt '1/1/2025 00:00:00' -exec bash -c '
  FIX_SECONDS=661361702
  FILE="$1"
  OLD_TIMESTAMP=$(stat -f %c "$FILE")
  NEW_TIMESTAMP=$(expr "$OLD_TIMESTAMP" - "$FIX_SECONDS")
  NEW_DATETIME=$(date -r "$NEW_TIMESTAMP" +%Y%m%d%H%M)
  touch -t "$NEW_DATETIME" "$FILE"
' _ {} \;

命令拆解说明

让我们一步步拆解这个命令的逻辑,确保你明白每个部分的作用:

  1. 筛选目标文件
    find . -type f -newermt '1/1/2025 00:00:00'
    这部分和你之前用的一样,会找出当前目录及子目录下所有创建时间晚于2025年1月1日的文件,也就是那些时间异常的文件。

  2. 批量执行子shell处理
    -exec bash -c '...' _ {} \;
    因为我们需要在处理每个文件时执行多条命令(计算时间戳、转换格式、修改时间),所以用bash -c启动一个子shell来封装这些逻辑。_是占位符(对应子shell的$0变量),{}会被find替换为当前找到的文件路径,作为子shell的$1参数。

  3. 固定修正秒数
    FIX_SECONDS=661361702
    你已经验证过这个数值是20年11个月15天对应的秒数,这里把它定义为变量,方便后续修改或维护。

  4. 获取文件原始创建时间戳
    OLD_TIMESTAMP=$(stat -f %c "$FILE")
    在Mac的stat命令中,-f %c用来获取文件的**创建时间(birth time)**对应的Unix时间戳(从1970年1月1日到该时间的秒数)。

  5. 计算修正后的时间戳
    NEW_TIMESTAMP=$(expr "$OLD_TIMESTAMP" - "$FIX_SECONDS")
    用原始时间戳减去固定的修正秒数,得到正确的时间戳。

  6. 转换为touch可识别的格式
    NEW_DATETIME=$(date -r "$NEW_TIMESTAMP" +%Y%m%d%H%M)
    date -r根据时间戳转换为具体时间,+%Y%m%d%H%Mtouch -t要求的格式(年、月、日、时、分)。

  7. 修改文件创建时间
    touch -t "$NEW_DATETIME" "$FILE"
    最后用touch -t把文件的创建时间设置为修正后的时间。

验证与注意事项

  • 先测试单个文件:在批量运行前,建议先找一个测试文件,单独执行子shell里的逻辑,确认时间计算和修改是否正确:
    FILE="test-file.txt"
    FIX_SECONDS=661361702
    OLD_TIMESTAMP=$(stat -f %c "$FILE")
    NEW_TIMESTAMP=$(expr "$OLD_TIMESTAMP" - "$FIX_SECONDS")
    date -r "$NEW_TIMESTAMP"  # 查看修正后的时间是否正确
    touch -t $(date -r "$NEW_TIMESTAMP" +%Y%m%d%H%M) "$FILE"
    stat -f "%SB" "$FILE"  # 验证文件创建时间是否已更新
    
  • 备份重要文件:修改文件元数据前,建议先备份重要文件,避免意外情况导致数据问题。
  • 确认修正秒数:再次确认661361702这个数值是否完全匹配你需要减去的时长,确保修正后的时间准确。

内容的提问来源于stack exchange,提问作者Peter Walker

火山引擎 最新活动