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