Shell脚本中的RegEx将RegEx过滤器连接到文件名中

xnifntxz  于 12个月前  发布在  Shell
关注(0)|答案(2)|浏览(112)

我想检测一个文件是否在一个目录中的名称与特定的日期戳。然而,也有一个时间戳连接到它。我可以计算出日期戳,但不是时间戳,所以我需要一些时间戳。
以下是示例文件名:backup_myserver_202310152100.log这是我的表达式:log_file="backup_${hostname_arg}_${logfile_sunday}[0-9]*.log",但它实际上搜索这个文件名(由echo检查):backup_myserver_20231015[0-9]*.log
如果有帮助的话,时间戳总是用for数字表示。
我试着从www和其他问题中得到解决方案,但似乎我不是为RegEx而生的。
我尝试了上面的表达式以及以下内容:log_file="backup_${hostname_arg}_${logfile_sunday}{....}.log"因为我读到一个点确实代表一个字符。消息来源的答案五花八门。

tcbh2hod

tcbh2hod1#

当给变量赋值时,存储在变量中的是模式本身(backup_myserver_20231015[0-9]*.log),而不是它对现有文件名的扩展,因为1)你给它加了双引号(引号之间不进行路径名扩展),2)路径名扩展从不在参数赋值的右侧进行。
验证所有这些的一个简单方法是输入declare -p log_file,看看log_file是什么以及它有什么值。您还可以键入echo "$log_file"(打印模式)和echo $log_file(打印文件名(如果存在)),因为$log_file没有引号,并且在执行echo之前执行了路径名扩展。
一个更好的方法是分配一个数组,使用不带引号的模式,并打开nullglob选项,这样如果没有匹配的日志文件,模式将扩展为空字符串(输出前缀为-|):

shopt -s nullglob
log_file=( backup_${hostname_arg}_${logfile_sunday}[0-9]*.log )
if (( ${#log_file[@]} == 0 )); then
  printf 'no log files\n'
else
  printf '%s\n' "${log_file[@]}"
fi
-| backup_myserver_202310152100.log
-| backup_myserver_202310152101.log
...

如果你想精确匹配4位数,你可以试试:

$ log_file=( backup_${hostname_arg}_${logfile_sunday}[0-2][0-9][0-5][0-9].log )

你也可以使用来自GNU findutilsfind,如果你有的话,用正则表达式代替更简单的glob模式:

find . -maxdepth 1 -regextype gnu-awk -type f -regex "\./backup_${hostname_arg}_${logfile_sunday}[0-9]{4}\.log"
guykilcj

guykilcj2#

你的指挥似乎很好

find -maxdepth 1 -type f -name  "backup_myserver_[0-9]*.log"

我试着把它放在一个小的shell脚本中,它也能工作。

#!/bin/bash
expr='backup_myserver_[0-9]*.log'
result=$(find ./ -maxdepth 1 -type f -name "${expr}")
echo $result

Code result of shell script

相关问题