如何创建一个 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 shell 之外的 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 作业每周运行一次此命令。例如,每周一早上 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

相关内容