Как создать сценарий bash, который создает папку для каждой недели в году?

В вашем шелл-коде мало смысла, так как он использует неправильный синтаксис для цикла forи подстановки для получения индексов, а также неправильно использует строки формата printf.

Я предполагаю, что вы хотели бы сделать что-то вроде этого:

i=0
for pathname in /home/folder/text/*; do
    i=$(( i + 1 ))
    printf '%s: %s\n' "$i" "$( basename "$pathname" )"
done

Это будет перечислять имена, найденные в /home/folder/text(, исключая скрытые имена ).

Вы можете заменить "$( basename "$pathname" )"выше на "${pathname##*/}", если хотите.

Использование массива, как показано в вашем собственном коде:

pathnames=( /home/folder/text/* )

i=0
for pathname in "${pathnames[@]}"; do
    i=$(( i + 1 ))
    printf '%s: %s\n' "$i" "$( basename "$pathname" )"
done

Хотите перебрать индексы массива?:

pathnames=( /home/folder/text/* )

for index in "${!pathnames[@]}"; do
    printf '%s: %s\n' "$index" "$( basename "${pathnames[$index]}" )"
done

Обратите внимание, что bashмассивы начинаются с нулевого индекса. Добавление 1 к каждому индексу:

pathnames=( /home/folder/text/* )

for index in "${!pathnames[@]}"; do
    printf '%s: %s\n' "$(( index + 1 ))" "$( basename "${pathnames[$index]}" )"
done
0
27.02.2021, 18:18
4 ответа

Вы можете положиться на команду date.

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

Пример вывода:

27-02-2021

Затем вы можете запускать эту команду один раз в неделю, используя задание cron. Например, запускайте эту команду каждый понедельник в 6 утра.

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

ВЫХОД:

03 -01

03 -08

03 -15

ЭСТ.

Будет напечатан день -месяца для каждого понедельника в течение следующих 52 недель, но его можно легко изменить на любое количество недель.

4
18.03.2021, 22:28

Вы могли бы сделать это короче, но моя цель состояла в том, чтобы сделать его понятным, а не коротким. Я также предполагаю, что вам нужны все понедельники данного года, а не понедельники следующего года, и что вы работаете в системе GNU или, по крайней мере, имеете доступ к реализации GNU dateв дополнение к оболочке 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
2
18.03.2021, 22:28

Чтобы получить дату в формате %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
1
18.03.2021, 22:28

Теги

Похожие вопросы