
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.


