その年の ISO 週番号で作成されたファイルを検索したいと思います。これら 2 つの値は、ユーザーが引数として指定します。
たとえば、ユーザーは次の 2 つの値を提供します。
Please specify the year: 2020
Please specify the ISO week number: 10
そして、スクリプトはfind
2020-03-02から2020-03-08までのファイルをリストするコマンドを実行しています。
find . -type f -newermt 2020-03-02 ! -newermt 2020-03-08
それを実行する簡単な方法はありますか(find
オプションの引数など)?
答え1
簡単ではありませんが、日付の計算を管理する GNU などのツールがあれば、date
可能です。
#!/bin/bash
#
# Find the date range for an ISO year and week number
#######################################################################
isoYear=$1
isoWeek=$2
shift 2
[[ $# -gt 0 ]] && fDir=$1 && shift # Starting directory (optional)
firstJan="1 Jan $isoYear"
fjDoW=$(date --date "$firstJan" +%u) # Day of week for 1st January
fjThu=$(date --date "$firstJan" +%F) # Week number for Thursday that week
[[ $fjDoW -ne 4 ]] && fjThu=$(date --date "$firstJan -$fjDoW days +4 days" +%F)
fjMon=$(date --date "$fjThu -3 days" +%F) # Start of ISO week
fjSun=$(date --date "$fjThu +3 days" +%F) # End of ISO week
echo "Searching ${fDir-.} for files in the range $fjMon .. $fjSun inclusive" >&2
find "${fDir-.}" -newermt "$(date --date "$fjMon -1 day" +%F)" \! -newermt "$fjSun" "$@"
典型的な使用法は次のようになります
./iso-year-week.sh 2020 04