名前に特定の範囲のユリウス暦の日付を含むファイルを探す

名前に特定の範囲のユリウス暦の日付を含むファイルを探す

ユリウス暦の日付を含むファイルのリストがあります。例:XXX_YY_AB21123.TXT待ってくださいXXX_YY_AB21124.TXT。今年は何百ものあります。名前に基づいてファイルを検索し、特定の範囲のファイルのみを返す方法が必要です。

例:60から90(2021年3月) XXX_YY_AB21060の間で、名前にユリウス暦の日付を含むすべてのファイル名を返します。XXX_YY_AB21090

どんなアイデアがありますか?

答え1

特定の日付のユリウス暦の日付を取得する必要がある場合は、date次の形式を使用できます。GNUを実装した場合、または互換性がある%j場合は、それを使用して他の形式から変換できます。date-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 rolumn で1 C終わるファイル名のリストを作成し、AB21その後に 60 ~ 90 の範囲の 10 進数、その後に.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)

関連情報