年間を通して毎週フォルダを生成するbashスクリプトをどのように生成できますか?

年間を通して毎週フォルダを生成するbashスクリプトをどのように生成できますか?

フォルダ名がその週の月曜日の日付である毎週フォルダを作成したいと思います。

たとえば、今週から次の週は02-22 03-01 03-08 03-15です。

答え1

#!/bin/bash
   
for n in {1..52};
do
     mkdir $(date -d"$n+monday" +%m-%d)
done

出力:

03-01

03-08

03-15

など。

これにより、次の52週間の毎週月曜日の月と日付が印刷されますが、必要な週数に簡単に変更できます。

答え2

短くすることもできますが、私の目標はあまりにも短くなく、より消化しやすくすることです。また、翌年の月曜日ではなく、特定の年のすべての月曜日が必要で、GNUシステムを使用しているか、少なくともdateGNUシェルの外部からGNU実装にアクセスできるとします。

#!/bin/bash

year="${1}"

if [[ "${year}" = "" ]]; then
    # Default the year to this year
    year="$(date +"%Y")"
fi

# What day of the week is January 1 of the given year?
readonly jan_one_day_of_week="$(date -d ${year}-01-01 +"%a")"

# Based on what day January 1 is, figure out when the first Monday is
case "${jan_one_day_of_week}" in
"Mon") day=1 ;;
"Tue") day=7 ;;
"Wed") day=6 ;;
"Thu") day=5 ;;
"Fri") day=4 ;;
"Sat") day=3 ;;
"Sun") day=2 ;;
*)
    echo 1>&2 "Unexpected day of the week: ${jan_one_day_of_week}"
    exit 1
esac

# Start printing each Monday until the next Monday we encounter isn't in
# the same year.
week=0
while [[ "$(date -d "${year}-01-0${day} + ${week} weeks" +%Y)" = "${year}" ]]; do
    date -d "${year}-01-0${day} + ${week} weeks" +"%m-%d"
    week=$((week + 1))
done

年パラメータを渡すと、その年の月曜日が印刷されます。パラメータを指定しないと、今年と見なされます。

出力は次のとおりです。

$ ./ex.sh
01-04
01-11
01-18
01-25
...
12-06
12-13
12-20
12-27

答え3

date コマンドを使用できます。

$ mkdir $(date +"%d-%m-%Y")

出力例:

27-02-2021

その後、cronジョブを使用して週に1回このコマンドを実行できます。たとえば、毎週月曜日の午前6時にこのコマンドを実行します。

答え4

%Y-%m-%d特定の年のすべての月曜日の日付形式を取得するには、次のようにします。

year=2021 ksh93 -c '
  printf "%(%F)T\n" {1..53}"th Monday in January $year" |
    grep "^$year"'

(ある年には52の月曜日があり、ある年には53の月曜日があります。)

形式をインポートし、%m-%d各ファイルのディレクトリを作成するには、その出力をcut -d- -f2- | xargs mkdir

%Y/%m-%d次の300回の月曜日(今日が月曜日の場合は今日を含む)で書式設定されたディレクトリを作成するには、次の手順を実行します。

ksh93 -c 'printf "%(%Y/%m-%d)T\n" +{0..299}Monday' | xargs mkdir -p

関連情報