Linux에서 특정 날짜 범위의 모든 토요일 목록을 YYYYMMDD 형식(예: 20170101 ~ 20170630)으로 얻는 방법은 무엇입니까?

Linux에서 특정 날짜 범위의 모든 토요일 목록을 YYYYMMDD 형식(예: 20170101 ~ 20170630)으로 얻는 방법은 무엇입니까?

Linux에서 특정 날짜 범위(예: 20170101~20170630)의 모든 토요일 목록을 YYYYMMDD 형식으로 가져와야 합니다.

답변1

GNU 날짜와 무차별 대입 사용:

start=20170101
end=20170630
cur=$start

increment="1 day"
while [ $(date +%s -d "$cur") -le $(date +%s -d "$end") ]
do
  if [ "$(date +%A -d "$cur")" = "Saturday" ]
  then
    printf "%s\n" "$cur"
    increment="1 week"
  fi
  cur=$(date +%Y%m%d -d "$cur + $increment")
done

답변2

다음을 사용하여 스크립트를 작성하세요.

#! /bin/bash
cur=20170101
end=20170630
# First upcoming saturday is:
cur=$(( cur+(6-$( date -d $cur +%w )) ))
# Keep increment by 7 days until 'end'
while (( end>cur )); do
    echo $cur
    cur=$( date -d "$cur+7days" +%Y%m%d )
done

그것은 다음을 제공합니다:

$ ./ILoveSaturdays.bash
20170107
20170114
...
20170617
20170624

답변3

GNU를 사용하여 가능한 한 적은 수의 명령을 date실행해 보십시오 (2):date

TZ=UTC0 date -f - '+%s %w' << EOF |
20170101
20170630
EOF
  awk -v d=86400 '{
    d1 = $1 + (6 - $2) * d
    getline
    for (t = d1; t <= $1; t += 7 * d) print "@" t}' |
  TZ=UTC0 date -f - +%Y%m%d

답변4

Perl에서 이것을 해보자:

perl -e '
use POSIX "strftime";

$start=$ARGV[0];
$end=$ARGV[1];
if(! ($start =~ /^(\d\d\d\d)(\d\d)(\d\d)$/)){
  die "bad format for first arg";
}
$epoch=(($1-1970)*365+($2-1)*28+$3-1)*24*60*60;
if(! ($end =~ /^(\d\d\d\d)(\d\d)(\d\d)$/)){
  die "bad format for first arg";
}

while(1){
  $cur=strftime("%Y%m%d", gmtime $epoch);
  if($cur ge $start){last;};
  $epoch += 24*60*60;
}

while(1){
  $wd = strftime("%u", gmtime $epoch);
  $cur = strftime("%Y%m%d", gmtime $epoch);
  if($cur >= $end){last;}
  if($wd == 6){
    printf "$cur\n";
  }
  $epoch += 24*60*60;
}' 20170101 20170630

관련 정보