이름에 특정 범위의 율리우스력 날짜가 포함된 파일 찾기

이름에 특정 범위의 율리우스력 날짜가 포함된 파일 찾기

율리우스력 날짜가 포함된 파일 목록이 있습니다. 예: 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)

관련 정보