
生产环境常见case就是分析文件是否被修改
在Bash中进行与日期相关的数*运学**算很困难,因为Bash没有内置的日期计算功能,也无法获取文件的修改时间等元数据。
虽然有stat(1)命令可以获取文件信息,但它的可移植性非常差,甚至在不同的GNU操作系统之间都存在差异。大多数机器都有stat命令,但它们接受的参数和语法各不相同。因此,如果脚本需要具备可移植性,就不应该依赖于stat(1)命令。还有一个名为finfo的示例可加载内建命令可以检索文件的元数据,但它也不是默认可用的。
我们所拥有的是test(或[[)命令,可以检查一个文件是否在另一个文件之前或之后被修改(使用-nt或-ot选项),以及touch命令,可以创建带有指定修改时间的文件。通过结合这些命令,我们可以实现许多功能。
通用脚本分享
下面是一个用于测试文件是否在特定日期范围内被修改的函数:
inTime() {
set -- "$1" "$2" "${3:-1}" "${4:-1}" "$5" "$6" # 默认月份和日期为1。
local file=$1 ftmp="${TMPDIR:-/tmp}/.f.$" ttmp="${TMPDIR:-/tmp}/.t.$"
local fyear=${2%-*} fmonth=${3%-*} fday=${4%-*} fhour=${5%-*} fminute=${6%-*}
local tyear=${2#*-} tmonth=${3#*-} tday=${4#*-} thour=${5#*-} tminute=${6#*-}
touch -t "$(printf '%02d%02d%02d%02d%02d' "$fyear" "$fmonth" "$fday" "$fhour" "$fminute")" "$ftmp"
touch -t "$(printf '%02d%02d%02d%02d%02d' "$tyear" "$tmonth" "$tday" "$thour" "$tminute")" "$ttmp"
(trap 'rm "$ftmp" "$ttmp"' RETURN; [[ $file -nt $ftmp && $file -ot $ttmp ]])
}
使用此函数,我们可以检查文件是否在某个特定的日期范围内进行了修改。
该函数接受几个参数:文件名、年份范围、月份范围、日期范围、小时范围和分钟范围。
任何范围都可以是单个数字,此时范围的起始和结束将相同。如果未指定或省略任何范围,将默认为0(对于月份/日期则为1)。
以下是一个用法示例:
$ touch -t 198404041300 file
$ inTime file 1984 04-05 && echo "file was last modified in April of 1984"
file was last modified in April of 1984
$ inTime file 2010 01-02 || echo "file was not last modified in January 2010"
file was not last modified in Januari 2010
$ inTime file 1945-2010 && echo "file was last modified after The War"
file was last modified after The War
学习更多
如果你想学习如何编写更加健壮和可靠的 Shell 脚本,减少生产环境中的错误和故障,那么关注我吧!我会分享 Shell 编程的最佳实践和建议,帮助你提高 Shell 脚本的鲁棒性和可维护性。如果你想深入了解 Shell 编程的实际应用和技巧,可以关注我的 《Shell 脚本编程最佳实践》专栏,里面有我在一线互联网大厂的实际生产经验和最佳实践 ,帮助你高效完成各种自动化任务。