我正在尝试将名称中带有日期的文件与系统的当前日期时间进行比较:
文件名采用以下格式:
文件名.yyyymmdd.hhmm.file(例如File156tr.20220914.0958.txt)
我想出了以下脚本:
#!/bin/bash
FROM_FILE=$(ls -1 /some/directory/File156tr.*.*.txt | grep -Eo '[[:digit:]]{8}')
NOW=$(date +"%Y%m%d")
DIFFERENCE=$((NOW - FROM_FILE))
if [ $DIFFERENCE -ge 1 ]; then
echo "There are files that are older than today's date"
fi
问题是,当该类型只有 1 个文件时,该脚本可以完美运行。但举例来说,如果我们有相同的文件,但名称中的日期不同 (例如同一目录中的 File156tr.20220913.1053.txt 和 File156tr.20220914.0958.txt)该脚本将不起作用,因为 ls 命令将打印文件名中的两个日期。
如果有多个文件具有相同的名称,但名称中的日期时间不同(如上所述),我如何打印出来只有其中最新的一个(最接近当前日期的那个)?
答案1
这就是循环的用途:
#!/bin/bash
for FILE in /some/directory/File156tr.*.*.txt
do
FROM_FILE=$(echo $FILE | grep -Eo '[[:digit:]]{8}')
NOW=$(date +"%Y%m%d")
DIFFERENCE=$(($NOW - $FROM_FILE))
if [ $DIFFERENCE -ge 1 ]; then
echo "There are files that are older than today's date"
fi
done
答案2
我正在寻找的脚本必须仅打印所有比今天更旧的文件中的最新文件。
我建议您简单地构建一个存在的文件名列表,删除与当前日期匹配的名称,然后对列表进行排序。列表中的最后一个条目是最新的。或者,如果您愿意,可以按相反顺序对列表进行排序,列表中的第一个条目是最新的。
假设您的路径部分中没有任何YYYYMMDD
日期字符串/some/directory/
,那么简单的操作可能会起作用:
#!/usr/bin/env bash
mr="$(
for f in /some/directory/File156tr.*.*.txt
do
[[ -f "$f" ]] && printf '%s\n' "$f"
done |
sort -r |
egrep -v "$(date "+%Y%m%d")" |
head -1
)"
if [[ -z "$mr" ]]
then
printf 'There are no files prior to today.\n'
else
printf 'The most recent file prior to today is "%s"\n' "$mr"
fi
此代码迭代所有与通配符匹配的文件,连接所有文件名并将它们传递给sort
. sort
将它们按降序排序,并删除包含YYYYMMDD
与今天日期匹配的字符串的所有文件名。的输出sort
通过管道传输以head -1
仅返回单个最高排序的文件名,或者如果没有比今天更旧的文件,则可能返回空字符串。