在 Linux 中循环遍历名称中带有日期模式的文件

Looping through files with a date pattern in name in Linux

我正在尝试将以下内容用于 tar 任何附加了日期的文件:

#!/bin/bash

createDate=[0-9]{4}-[0-9]{2}-[0-9]{2}

for file in $HOME/test/*.log.$createDate ; do
    log=$(basename $file)
    find . -type f | tar -zcvf  $log.tar $log
done

这应该 tar 任何在日志扩展名后附加日期的文件,例如 test.log.2020-01-01。但是,我得到一个错误:

tar: *.log.[0-9]{4}-[0-9]{2}-[0-9]{2}: Cannot stat: No such file or directory

因此,它按字面意义将此模式读取为字符串。我需要的是它使用模式来匹配日志扩展名之后具有该日期格式的任何文件。这最终将进入 logrotate 配置文件的 postrotate 部分,但我需要确保它首先工作。

您正在使用此模式作为 shell 全局模式:

createDate=[0-9]{4}-[0-9]{2}-[0-9]{2}

这实际上是一个正则表达式,而不是真正的 shell glob 模式。您的全局匹配 失败 并且只给出一个结果:*.log.[0-9]{4}-[0-9]{2}-[0-9]{2}

可以使用以下方法更改此行为:

shopt -s nullglob

您的脚本应修改为:

shopt -s nullglob

for file in $HOME/test/*.log.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]; do
    log=$(basename "$file")
    find . -type f | tar -zcvf "$log.tar" "$log"
done