date
命令是 Bash shell 中的一个实用工具,它不仅存在于大多数 Linux 发行版中,甚至在 macOS 中也是默认配置的。本指南将深入探讨如何在命令行中使用 date
命令,并演示如何在 shell 脚本中利用它执行更复杂的任务,而不仅仅是显示当前时间。
运行不带任何参数的 date
命令将显示当前日期和时间,以及您所在的时区信息:
date
默认输出格式可能不够直观。 例如,年份出现在时区之后,而不是月份和日期之后。幸运的是,date
命令允许您通过传递不同的选项来定制输出格式。 实际上,可以使用超过 40 种不同的选项来精细控制日期和时间的显示方式。
要使用这些选项,您需要键入 date
,然后是一个空格,接着是一个加号 +
,最后是选项本身,选项以百分号 %
开头。 例如,%c
选项(区域设置格式的日期和时间)会使日期和时间以与您的区域设置相关的标准化格式显示。 您的区域设置由您在安装操作系统时提供的地理和文化信息决定,它管理货币符号、纸张大小、时区以及其他文化规范等设置。
date +%c
使用 %c
选项后,年份在输出中显示的位置更为自然。
您可以一次传递多个选项给 date
命令,一组选项被称为格式化字符串。 要显示星期几的名称(%A
)、月份中的日期(%d
)和月份的名称(%B
),可以使用以下命令:
date +%A%d%B
上述命令可以工作,但输出可能不够美观。 为此,我们可以将整个格式化字符串用引号括起来,从而可以在其中包含空格。 请注意,+
号仍然在引号之外。
date +"%A %d %B"
您还可以在格式化字符串中添加文本:
date +"Today is: %A %d %B"
查阅 date
命令的 手册页 以查找所需的选项可能会非常耗时。 为了方便您查找,我们对这些选项进行了分组。
显示日期和时间的选项
%c
:以您所在地区的格式打印日期和时间,包括时区。
显示日期的选项
%D
:以 mm/dd/yy 格式打印日期。%F
:以 yyyy-mm-dd 格式打印日期。%x
:以您所在地区的格式打印日期。
显示星期几的选项
%a
:打印星期几的缩写名称,例如 Mon、Tue、Wed 等。%A
:打印星期几的全名,例如 Monday、Tuesday、Wednesday 等。%u
:打印星期几的数字表示,其中 Monday = 1、Tuesday = 2、Wednesday = 3,依此类推。%w
:打印星期几的数字表示,其中 Sunday = 0、Monday = 1、Tuesday = 2,依此类推。%d
:打印月份中的第几天,如果需要,可以使用前导零 (01, 02 … 09)。%e
:打印月份中的第几天,如果需要,可以使用前导空格(’ 1’、’ 2′ …’ 9’)。 注意,撇号不打印。%j
:打印一年中的第几天,如果需要,可以使用最多两个前导零。
显示周数的选项
%U
:打印一年中的周数,将星期日视为一周的第一天。例如,一年的第3周、一年的第20周等。%V
:打印一年中的 ISO 周数,将星期一视为一周的第一天。%W
:打印一年中的周数,将星期一视为一周的第一天。
显示月份的选项
%b
或 %h
:打印月份的缩写名称,例如 Jan、Feb、Mar 等。%B
:打印月份的全名,例如 January、February、March 等。%m
:打印月份的数字表示,如果需要,可以使用前导零 01、02、03 … 12。
显示年份的选项
%C
:打印世纪(不包括年份)。 例如,2019 年将打印 20。%y
:将年份打印为两位数。 例如,2019 年将打印 19。%Y
:将年份打印为四位数。
显示时间的选项
%T
:将时间打印为 HH:MM:SS。%R
:使用 24 小时制将小时和分钟打印为 HH:MM,不带秒。%r
:根据您的区域设置打印时间,使用 12 小时制和 AM 或 PM 指示符。%X
:根据您的区域设置打印时间,使用 24 小时制。 请注意,在测试期间,此选项的行为与 %r 完全相同。 在为英国语言环境配置并设置为 GMT 的 Linux 机器上,它按预期使用没有 AM 或 PM 指示符的 24 小时制打印时间。
显示小时的选项
%H
:打印小时,范围为 00、01、02 … 23。%I
:使用 12 小时制打印小时,范围为 00、01、02 … 12,如果需要,可以使用前导零。
显示分钟的选项
%M
:打印分钟,范围为 01、02、03 … 59,如果需要,带有前导零。
显示秒数的选项
%s
:打印自 1970-01-01 00:00:00 UTC 以来的秒数(Unix 时间)。%S
:打印秒数,范围为 01、02、03 … 59,如果需要,带有前导零。%N
:打印纳秒。
显示时区信息的选项
%z
:打印您的时区与 UTC 之间的时差。%:z
:打印您的时区与 UTC 之间的时差,小时和分钟之间带有冒号 :
。 注意冒号 :
在 %
符号和 z
之间。%::z
:打印您的时区与 UTC 之间的时差,小时、分钟和秒之间使用冒号 :
。 注意 ::
在 %
符号和 z
之间。%Z
:打印字母时区名称。
与格式相关的选项
%p
:以大写形式打印 AM 或 PM 指示符。%P
:以小写形式打印 am 或 pm 指示符。 请注意这两个选项的特殊之处,小写的 p
给出大写输出,而大写的 P
给出小写输出。%t
:打印一个制表符。%n
:打印一个新行。
修改其他选项的选项
这些修饰符可以插入到 %
和其他选项的字母之间,以修改它们的显示方式。 例如,%-S
将删除一位数秒值的前导零。
-
:单个连字符可防止对单个数字值进行零填充。_
:单个下划线为单个数字值添加前导空格。0
:为单个数字值提供前导零。^
:如果可能,则使用大写(并非所有选项都遵循此修饰符)。#
:如果可能,则使用与默认情况相反的选项(并非所有选项都遵循此修饰符)。
其他两个实用技巧
要获取文件的最后修改时间,请使用 -r
(参考)选项。 请注意,这使用的是 -
(连字符)而不是 %
符号,并且不需要 +
符号。 在您的主文件夹中尝试以下命令:
date -r .bashrc
通过 TZ
设置,您可以在单个命令的持续时间内更改时区。
TZ=GMT date +%c
在脚本中使用日期
在 Bash shell 脚本中打印时间和日期非常简单。 创建一个文本文件,内容如下,并将其保存为 gd.sh
:
#!/bin/bash TODAY=$(date +"Today is %A, %d of %B") TIMENOW=$(date +"The local time is %r") TIME_UK=$(TZ=BST date +"The time in the UK is %r") echo $TODAY echo $TIMENOW echo $TIME_UK
输入以下命令设置执行权限,使脚本可执行:
chmod +x gd.sh
使用以下命令运行脚本:
./gd.sh
我们可以使用 date
命令来提供时间戳。 下面的脚本将创建一个以时间戳为名称的目录。 然后,它会将当前文件夹中的所有文本文件复制到该目录中。 通过定期运行此脚本,我们可以拍摄文本文件的快照。 随着时间的推移,我们将建立一系列文件夹,其中包含不同版本的文本文件。
请注意,这并非一个强大的备份系统,它仅用于说明目的。
创建一个包含以下内容的文本文件,并将其保存为 snapshot.sh
:
#!/bin/bash # 获取日期和时间 date_stamp=$(date +"%F-%H-%M-%S") # 创建一个以时间戳为名称的目录 mkdir "$date_stamp" # 将当前文件夹中的文件复制到该目录中 cp *.txt "$date_stamp" # 完成,报告并退出 echo "Text files copied to directory: "$date_stamp
输入以下命令设置执行权限,使脚本可执行:
chmod +x snapshot.sh
使用以下命令运行脚本:
./snapshot.sh
您将看到已创建一个目录,其名称是执行脚本的日期和时间,目录内是文本文件的副本。
只要稍加思考和创造力,即使是简单的 date
命令也可以在生产中发挥重要作用。