在目录中的文件进行 for 循环时如何使用模式

在目录中的文件进行 for 循环时如何使用模式

我是一个 bash 脚本编写新手。需要以下方面的帮助。我有一个使用 inotifywait 来监视目录的脚本。另一个进程将在夜间删除 csv 文件。该文件的格式为文件名_YYYYMMDD.csv。我的脚本采用最旧的带时间戳的文件并将其重命名文件名.csv,因此它已准备好被另一个外部进程使用。在完美的世界中,一个文件进入,在没有时间戳的情况下被重命名,然后被处理。外部进程将文件移动到存档文件夹。如果外部进程关闭,带时间戳的文件将累积在文件夹中。我的脚本在访问目录时会重命名第一个文件,但其余文件将保持不变,直到第一个文件被存档。然后我的脚本找到最旧的文件,重命名它,然后退出。

当带时间戳的文件首次访问目录时,我的脚本会检查名称中的时间戳:

regex='_[0-9]{4}[0-9]{2}[0-9]{2}(.csv)$'
if [[ $file =~ $regex ]]; then

这很好用。我检查是否存在名为文件名.csv。如果没有,该文件将被重命名。

当处理和归档文件时,脚本检测到该文件已消失,获取基本名称并查找与该基本名称匹配的下一个最旧的文件,将其重命名,然后退出。

最后,这是我需要帮助的地方。如何修改以下代码以查找与模式匹配的最旧文件?如果我只是寻找基本名称,我会选择一个格式错误的文件名,例如文件名_YYMM,这是我不想要的。

unset -v oldest
for f in $mybasename*; do
   [[ -z $oldest || $f -ot $oldest ]] && oldest=$f
done

现在 $mybasename 只是文件名。我如何才能使用正则表达式,例如:

regex='$mybasename_[0-9]{4}[0-9]{2}[0-9]{2}(.csv)$'
for f in $regex; do
   [[ -z $oldest || $f -ot $oldest ]] && oldest=$f
done

谢谢!

相关内容