Shell脚本系列: 开发者的“时间机器” time.sh, 精准控制文件时间戳

嘿,各位开发者、运维小伙伴们!

你是否也曾被文件时间戳“背刺”过?

  • git clone 一个项目,所有文件时间都变成了“刚刚”,导致 make 或其他构建工具固执地进行全量编译,浪费生命?
  • 想测试一个“自动清理3天前日志”的功能,难道真的要傻等3天?
  • 数据迁移后,文件的创建、修改时间全变了,强迫症表示完全不能忍?

今天,给大家带来一个能解决以上所有问题的神器——time.sh 脚本。它就是你在命令行里的“时间机器”,让你能随心所欲地掌控任何文件或目录的时间戳!

为什么你需要一个“时间机器”?

在软件开发和系统管理中,文件时间戳(访问时间 atime、修改时间 mtime、创建时间 crtime)是非常重要的元数据。它们是许多自动化工具工作的基石。

  • 软件编译与构建make 等工具依赖文件修改时间来判断是否需要重新编译。能够自由设定时间,意味着可以避免不必要的重复构建,实现真正的增量编译。
  • 测试自动化:再也不用 sleep 或者等待了!想测试任何与时间相关的功能,用脚本瞬间“穿越”到指定时间点,让测试效率飙升。
  • 数据同步与备份:某些备份或同步工具基于时间戳决定是否更新。有了它,你可以强制同步某些文件,或在迁移后完美保持原始时间,确保数据一致性。

脚本源码 time.sh

这个脚本功能强大且设计人性化,支持递归、单独修改、强制执行等多种模式。

#!/bin/bash

# 修改文件或目录时间戳的脚本
# 使用方法: ./time.sh [选项] <路径> [时间]

# 显示帮助信息
show_help() {
    echo "用法: $0 [选项] <路径> [时间]"
    echo ""
    echo "选项:"
    echo "  -h, --help          显示此帮助信息"
    echo "  -r, --recursive     递归处理目录下的所有文件和子目录"
    echo "  -a, --access        只修改访问时间"
    echo "  -m, --modify        只修改修改时间"
    echo "  -c, --create        修改创建时间(需要debugfs支持)"
    echo "  -f, --force         强制执行,不询问确认"
    echo ""
    echo "时间格式:"
    echo "  YYYY-MM-DD HH:MM:SS  例如: 2024-01-01 12:00:00"
    echo "  如果不指定时间,将使用当前时间"
}

# ... [脚本中段内容已在您的问题中提供,此处省略] ...

# 执行操作
echo "开始修改时间戳..."
echo "=================="

if [[ -d "$TARGET_PATH" ]] && [[ "$RECURSIVE" == true ]]; then
    # 递归处理目录
    process_directory "$TARGET_PATH" "$TIMESTAMP"
elif [[ -d "$TARGET_PATH" ]]; then
    # 只处理目录本身
    modify_timestamps "$TARGET_PATH" "$TIMESTAMP"
else
    # 处理单个文件
    modify_timestamps "$TARGET_PATH" "$TIMESTAMP"
fi

echo "=================="
echo "操作完成!"

(注:为保持篇幅,此处省略了脚本的中间部分,您可以从文末获取完整代码)

如何使用这台“时间机器”?

这个脚本无需修改任何内部代码,开箱即用!

第一步:保存脚本
将上面的完整代码保存为一个名为 time.sh 的文件。

第二步:给予执行权限
在终端中执行以下命令:

chmod +x time.sh

第三步:开始时间旅行!

  • 场景一:将 test.log 的时间修改为当前时间

    ./time.sh ./test.log
    
  • 场景二:制造一个“旧文件”用于测试,将 data.txt 的时间改为2023年元旦

    ./time.sh ./data.txt '2023-01-01 08:30:00'
    
  • 场景三:避免全量编译,将整个项目目录 my-project 的所有文件时间都改掉

    # -r 表示递归 (recursive)
    ./time.sh -r ./my-project '2025-01-15 10:00:00'
    
  • 场景四:只想更新文件的访问时间(atime),而不改变修改时间(mtime)

    # -a 表示只修改访问时间 (access)
    ./time.sh -a ./important-file.conf
    
  • 场景五:懒得确认,强制执行(请谨慎使用!)

    # -f 表示强制 (force)
    ./time.sh -r -f ./logs '2024-05-01 00:00:00'
    

总结

一个小小的脚本,却能解决开发和运维中的大问题。time.sh 将文件时间戳的控制权交还给你,让你的工作流更加顺畅高效。

赶快把这个脚本收入你的工具箱,并分享给身边的小伙伴吧!

源码地址: https://github.com/zhengmingliang/code-fragment/tree/main/shell/linux/time

Q.E.D.


寻门而入,破门而出