создание каталога только с названием месяца

8

Отправляя вопрос из любопытства, я хотел создать каталог, например, с января по февраль ... до декабря, поэтому я создал их, указав имя по отдельности. ( mkdir January February.... и т. д.) Можно ли легко создавать каталоги или имена файлов с названиями всех месяцев?

например: touch {1..10}легко создаст 10 файлов 1, 2, 3, 10, например, есть ли другое решение для создания файлов или каталога с названием месяца?

Картик
источник

Ответы:

18

POSIXly,

(IFS=';'; set -f; mkdir -- $(locale mon))

Обратите внимание, что это названия месяцев на текущем языке. Замените на, LC_ALL=C locale monесли хотите английские, независимо от языка пользователя.

С помощью zshвы также можете использовать $langinfoспециальный ассоциативный массив (в zsh/langinfoмодуле):

zmodload zsh/langinfo
eval mkdir -- '$langinfo[MON_'{1..12}']'

Хоть

mkdir -- ${(s:;:)"$(locale mon)"}

будет короче. В rc/ esкоторые являются другими оболочками с операторами расщепления, где вы можете указать разделители (кроме как с помощью этой глобальной $IFSнастройки, как в оболочках, подобных Bourne):

mkdir -- ``';'{locale mon}
Стефан Шазелас
источник
9

Модификация скрипта Heemayl

for i in {1..12} ; do
   mkdir $(LC_TIME=C date +%B -d "${i}/15")
done

Без петли

LC_TIME=C date +%B -f <(printf "%d/15\n" {1..12}) | xargs mkdir
Костас
источник
8

Вы можете использовать циклическую конструкцию с GNU, dateкоторая принимает +1 month, +2 monthsкак входные данные:

i=1; while ((i<=12)); do mkdir "$(date -d "+$i month" '+%B')"; ((i++)); done

Пример:

$ i=1; while ((i<=12)); do date -d "+$i month" '+%B'; ((i++)); done
September
October
November
December
January
February
March
April
May
June
July
August
heemayl
источник
3
Установите i на 5 в начале, чтобы начать с Яна.
123
2
@ 123 Скажи это снова 22 дня;)
Heemayl
4

Python знает все названия месяцев:

mkdir $(python -c 'import calendar; print(" ".join(calendar.month_name))')

Или мы можем использовать python напрямую для создания каталога:

python -c 'import calendar,locale,os;locale.setlocale(locale.LC_ALL, "");[os.mkdir(m) for m in calendar.month_name if m]'

Суть вышесказанного в том, [os.mkdir(m) for m in calendar.month_name if m]что делает каталог на каждый месяц в calendar.month_name. Это создаст сообщение об ошибке и выйдет, если какой-либо из каталогов уже существует. Если мы хотим избежать этого, мы можем проверить существование каталогов перед вызовом mkdir:

python -c 'import calendar,os;[os.mkdir(m) for m in calendar.month_name if m and not os.path.exists(m)]'

Пример:

$ python -c 'import calendar,os;[os.mkdir(m) for m in calendar.month_name if m]'
$ ls
April   December  January  June   May       October
August  February  July     March  November  September

интернационализация

Стефан Шазелас указывает, что вышеизложенное печатает английские названия месяцев. Чтобы узнать названия местных месяцев, он предлагает:

python -c 'import calendar,locale,os;locale.setlocale(locale.LC_ALL, "");[os.mkdir(m) for m in calendar.month_name if m]'
John1024
источник
@ StéphaneChazelas Спасибо. Я обновил ответ. (Ваш locale monначальник и у меня уже есть мой +1.)
John1024
2

Используя локали и предполагая Linux (вывод locale(1)отличается в других системах) и bash(1):

#! /bin/sh
(
    eval "$( locale -k -c LC_TIME | grep ^mon= )" || exit
    IFS=\; months=($mon)
    mkdir "${months[@]}"
)
Сату Кацура
источник
months=($mon)это не shсинтаксис. Это ksh93или bashсинтаксис.
Стефан Шазелас