查找名称中包含特定范围儒略日的文件

查找名称中包含特定范围儒略日的文件

我有一个文件列表,其中包含儒略历日期。例如:XXX_YY_AB21123.TXT等等XXX_YY_AB21124.TXT。我今年有数百个。我需要一种根据名称搜索文件并仅返回特定范围的文件的方法。

示例:返回名称中嵌入儒略日期的所有文件名,介于 60 到 90(2021 年 3 月) XXX_YY_AB21060之间XXX_YY_AB21090

有任何想法吗?

答案1

如果您需要获取特定日期的儒略日期,您可以使用date%j格式,如果您date是 GNU 实现或兼容的,请使用-d将其从其他格式转换:

$ date -d "2021/03/01" +%j
060

一旦你知道了这一点,你就可以使用 glob 和大括号扩展来实现你想要的:

$ shopt -s nullglob  # prevent unmatched globs from returning verbatim
$ printf '%s\n' *_*_*{060..090}.TXT
XXX_YY_AB21060.TXT
XXX_YY_AB21061.TXT
XXX_YY_AB21062.TXT
XXX_YY_AB21063.TXT
XXX_YY_AB21064.TXT
XXX_YY_AB21065.TXT
[...]

答案2

zsh

print -rC1 -- **/*AB21<60-90>.txt(N)

print raw on 1 Column 列出以 结尾的文件名列表,AB21后跟 60 到 90 范围内的十进制数字,后跟.txt当前工作目录中或下方的文件名(忽略隐藏目录)。

要计算给定类似表示的范围Mar 2021,您可以执行以下操作:

month='Mar 2021'

zmodload zsh/datetime

# Mar-2021 to epoch (for first day in that month):
TZ=UTC0 strftime -r -s start '%b %Y' $month

# month after in 2021-04 format obtained by adding 35 days:
TZ=UTC0 strftime    -s t     %Y-%m   $(( start + 35 * 86400 ))

# convert that to epoch time (of the first day of month after)
TZ=UTC0 strftime -r -s t     %Y-%m   $t

# convert both to YYJJJ
TZ=UTC0 strftime    -s start %y%j    $start
TZ=UTC0 strftime    -s end   %y%j    $(( t - 86400 ))
range="<$start-$end>"

print -rC1 -- **/*AB$~range.txt(N)

相关内容