CentOS shell获取当前时间并写入文件名:一步错,全盘乱,这招把日志、备份、归档一次管到底
在CentOS里跑脚本,最尴尬的不是命令写错,而是生成的文件叫啥自己都忘了。尤其是日志、备份、数据库导出,一旦重名,新文件直接覆盖旧文件,哭都来不及。今天这篇就给你一套“时间戳命名”万能模板,复制粘贴就能用,再也不怕文件打架。

一、为什么非得把时间塞进文件名
1. 防重名:同一份脚本跑多次,时间戳精确到秒,文件名天然唯一。
2. 易排序:20250917163001.log 这种格式,ls 一眼就能看出谁先谁后。
3. 好追溯:出问题按时间点找文件,省得翻箱倒柜。
二、最简命令:一行就能用
打开终端,直接敲:

touch my_$(date +%Y%m%d%H%M%S).txt
回车,你会看到当前目录蹦出个类似 my_20250917163001.txt 的新文件。
解释:date +%Y%m%d%H%M%S 会把时间捏成“年月日时分秒”连续数字,中间没空格,shell 友好。
三、脚本里怎么写:三行模板,谁都会改
#!/bin/bash
NOW=$(date +%Y%m%d%H%M%S)
tar -zcf /data/backup/www_${NOW}.tar.gz /var/www/html
把上面内容存成 backup.sh,chmod +x backup.sh 后执行,每次都在 /data/backup/ 里生成带时间戳的压缩包,旧包安然无恙。
四、想再短点:一行版也行
tar -zcf /data/backup/www_$(date +%Y%m%d%H%M%S).tar.gz /var/www/html
适合临时手打,懒得写脚本。
五、毫秒级精度:高手玩法
秒级不够?CentOS 7 以上自带 nanosecond 支持:
touch log_$(date +%Y%m%d%H%M%S%3N).log
%3N 取毫秒,一秒内跑一百次也不会撞车。
六、别踩坑:这些细节一次说清
1. 空格是炸弹:文件名里千万别带空格,日期格式用连续数字最稳。
2. 时区别忽略:服务器如果是 UTC,记得先执行 timedatectl set-timezone Asia/Shanghai,否则时间戳对不上北京时间。
3. 定时任务专用:crontab 里 % 要加反斜杠转义,写成:
0 2 * * * tar -zcf /backup/db_\$(date +\%Y\%m\%d\%H\%M\%S).sql.gz /var/lib/mysql
七、真实场景:日志切割脚本
需求:/var/log/nginx/access.log 每天暴涨,想按小时切走。
#!/bin/bash
LOGDIR=/var/log/nginx
SUFFIX=$(date +%Y%m%d%H)
mv $LOGDIR/access.log $LOGDIR/access.${SUFFIX}.log
systemctl reload nginx
扔进 /etc/cron.hourly,日志乖乖按小时带戳归档,运维睡个安稳觉。
八、备份目录清理:只留最近七天
时间戳文件多了也占盘,加一行清理:
find /data/backup -name "www_*.tar.gz" -mtime +7 -delete
跑备份脚本的尾巴顺手带上,磁盘永远不满。
九、快速检查:你的脚本合格吗
1. 执行完 ls 看文件名,带不带时间戳一眼可见。
2. 多跑几次,确认旧文件不被覆盖。
3. 把系统时间往前调一分钟再跑,观察新文件时间是否对应变化,验证 date 命令有效性。
照上面做,CentOS shell 获取当前时间并写入文件名这件事,基本就焊死了。**复制粘贴不怕忘,脚本跑烂不再慌。**

