date
命令在 Linux(包括 CentOS)中用于显示和设置系统的日期和时间
我们在下面这些场景中经常会用到:
-
系统日志记录: 在系统日志中,时间戳是非常重要的信息。
date
命令可以用于在脚本或命令中生成当前时间戳,并将其写入日志文件。# 在日志文件中带时分秒的标记 [root@aleng ~]# date +"%Y%m%d%H%M%S" 20231210223024 # 以天为单位的日志中只需要保留年月日 [root@aleng ~]# date +"%Y%m%d" 20231210 # 如果我们需要在批量解压一个压缩包的文件到同一个目录,同时压缩包不同目录可能还有同名的文件时 # 在压缩包解压后,可能需要在文件后面添加一个时间戳,但是由于移动文件的速度很快,可能还需要精确到毫秒 # 那么就需要在串上毫秒值 [root@aleng ~]# date +"%Y%m%d%H%M%S%N" 20231210223607439382638 # 如果感觉太长了,还可以裁切自己需要的部分,确保不会出现重名文件 [root@aleng ~]# date +"%Y%m%d%H%M%S%N"|cut -b 1-18 202312102236038490
-
定时任务和计划任务: 在编写定时任务或计划任务时,可能需要获取当前的日期和时间,以便根据时间执行不同的操作。
date
命令可以用于在脚本中获取当前的日期和时间信息。#!/bin/bash # 获取当前小时 current_hour=$(date +"%H") # 打印当前小时 echo "当前小时:$current_hour" # 根据当前小时执行不同的操作 if [ "$current_hour" -lt 12 ]; then echo "早上好!" # 在这里添加早上的任务或操作 else echo "下午好!" # 在这里添加下午的任务或操作 fi
-
备份和归档: 在进行备份或归档操作时,通常会在备份文件名或目录名中包含时间戳,以便轻松追踪备份的时间。
date
命令用于生成这样的时间戳。# 备份文件的时候也可以使用第一点的时间戳方式,或者是拼接成易读的格式 # 不建议在文件或者目录中使用空格,可能会出现难以预料的情况,可以使用下划线拼接 [root@aleng ~]# date +"%Y-%m-%d_%H:%M:%S" 2023-12-10_22:40:54
-
文件或目录的时间戳修改: 有时,需要更改文件或目录的时间戳,以反映某些操作的发生时间。
date
命令可以用于设置文件的访问时间、修改时间或创建时间。[root@aleng ~]# stat upload_file.sh File: ‘upload_file.sh’ Size: 14044 Blocks: 32 IO Block: 4096 regular file Device: fd01h/64769d Inode: 788711 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2023-12-10 22:22:34.682381932 +0800 Modify: 2023-12-08 19:42:00.000000000 +0800 Change: 2023-12-10 22:22:30.647252256 +0800 # 我们这里修改文件的 Modify 时间 [root@aleng ~]# touch -m -t `date +"%Y%m%d%H%M.%S"` upload_file.sh [root@aleng ~]# stat upload_file.sh File: ‘upload_file.sh’ Size: 14044 Blocks: 32 IO Block: 4096 regular file Device: fd01h/64769d Inode: 788711 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2023-12-10 22:22:34.682381932 +0800 Modify: 2023-12-10 22:47:40.000000000 +0800 Change: 2023-12-10 22:47:40.504716571 +0800 # 同样可以修改 Access 和 Change [root@aleng ~]# touch -a -t `date +"%Y%m%d%H%M.%S"` upload_file.sh [root@aleng ~]# stat upload_file.sh File: ‘upload_file.sh’ Size: 14044 Blocks: 32 IO Block: 4096 regular file Device: fd01h/64769d Inode: 788711 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2023-12-10 22:49:26.000000000 +0800 Modify: 2023-12-10 22:49:23.000000000 +0800 Change: 2023-12-10 22:49:26.835127351 +0800 Birth: -
扩展一下 Access Modify Change 三个的区别
- Access 时间戳:
- 表示文件最后一次被访问的时间。
- 在你的例子中,Access 时间戳是
2023-12-10 22:49:26.000000000 +0800
,即文件最后一次被访问的时间。
- Modify 时间戳:
- 表示文件内容最后一次被修改的时间。
- 在你的例子中,Modify 时间戳是
2023-12-10 22:49:23.000000000 +0800
,即文件最后一次被修改的时间。
- Change 时间戳:
- 表示文件元数据(metadata)最后一次被修改的时间。
- 在你的例子中,Change 时间戳是
2023-12-10 22:49:26.835127351 +0800
,即文件元数据最后一次被修改的时间。
# 新创建一个文件,这三个时间是一样的。 [root@aleng ~]# touch 1 [root@aleng ~]# stat 1 File: ‘1’ Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: fd01h/64769d Inode: 788698 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2023-12-10 22:57:08.126924294 +0800 Modify: 2023-12-10 22:57:08.126924294 +0800 Change: 2023-12-10 22:57:08.126924294 +0800 Birth: - # 当你查看这个文件的内容,Access 时间会修改为查看的时间 [root@aleng ~]# more 1 [root@aleng ~]# stat 1 File: ‘1’ Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: fd01h/64769d Inode: 788698 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2023-12-10 22:57:20.813331239 +0800 Modify: 2023-12-10 22:57:08.126924294 +0800 Change: 2023-12-10 22:57:08.126924294 +0800 Birth: - # 往文件里面写点东西 Modify 变了,因为文件元数据变了,所有 Change 也变了。 [root@aleng ~]# echo "ceshi" >> 1 [root@aleng ~]# stat 1 File: ‘1’ Size: 6 Blocks: 8 IO Block: 4096 regular file Device: fd01h/64769d Inode: 788698 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2023-12-10 22:57:20.813331239 +0800 Modify: 2023-12-10 23:02:45.407743298 +0800 Change: 2023-12-10 23:02:45.407743298 +0800 Birth: - # 如果需要单独修改 Change ,可以修改文件的权限,这样就只有 Change 会改变 [root@aleng ~]# chmod o+w 1 [root@aleng ~]# stat 1 File: ‘1’ Size: 6 Blocks: 8 IO Block: 4096 regular file Device: fd01h/64769d Inode: 788698 Links: 1 Access: (0646/-rw-r--rw-) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2023-12-10 22:57:20.813331239 +0800 Modify: 2023-12-10 23:02:45.407743298 +0800 Change: 2023-12-10 23:05:13.588496438 +0800 Birth: -
- Access 时间戳:
-
日志文件的轮转: 在日志管理中,经常需要对日志文件进行定期轮转。
date
命令可以用于生成包含时间戳的新日志文件名,以便进行轮转。#!/bin/bash # 指定日志文件路径 log_file="/path/to/your/logfile.log" # 获取当前日期作为时间戳(格式为YYYYmmdd) timestamp=$(date +"%Y%m%d") # 在日志文件名中添加时间戳并创建新日志文件 new_log_file="${log_file%.log}_${timestamp}.log" # 将日志文件进行轮转(例如,将旧日志文件备份或删除,然后将新日志文件用于记录) # 这里只是一个示例,具体的轮转操作取决于你的需求和日志管理策略 mv "$log_file" "$new_log_file" touch "$log_file" # 在新日志文件中写入一些示例日志 echo "日志轮转于 $(date)" >> "$log_file" # 打印消息 echo "日志已轮转,新日志文件为: $new_log_file"
-
构建脚本: 在软件开发中,构建脚本可能需要生成包含构建时间信息的版本号或构建编号。
date
命令可以用于生成这样的信息。#!/bin/bash # 指定软件版本号的前缀(可以根据实际情况调整) version_prefix="1.0" # 获取当前日期作为构建日期,格式为YYYYMMDD build_date=$(date +"%Y%m%d") # 生成版本号,例如:1.0.20231210 software_version="$version_prefix.$build_date" # 打印生成的版本号 echo "生成的软件版本号为: $software_version" # 在构建过程中,你可以使用这个版本号进行后续操作,比如将其写入代码中、生成可执行文件等
-
监控和性能分析: 在监控和性能分析场景中,可能需要记录事件的发生时间。
date
命令可以帮助生成时间戳,以便进行分析。#!/bin/bash # 模拟事件的名称或描述 event_name="Example Event" # 获取当前时间戳 timestamp=$(date +"%Y-%m-%d %H:%M:%S") # 记录事件到日志文件,包含事件名称和时间戳 echo "[$timestamp] $event_name" >> event_log.txt # 打印消息 echo "事件 '$event_name' 已记录到日志文件."