shell判断文件是否修改 (shell脚本判断文件修改日期和类型)

shell判断日期小于当前日期,shell修改文件时间命令

生产环境常见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 脚本编程最佳实践》专栏,里面有我在一线互联网大厂的实际生产经验和最佳实践 ,帮助你高效完成各种自动化任务。