Я хотел бы создать имя каталога для каждого месяца. Я знаю, после некоторой игры с оболочкой, что:
date -d 1/01 +%b # Gives Jan
date -d 2/01 +%b # Gives Feb
.
date -d 12/01 +%b # Gives Dec
Поэтому я использовал расширение скобки echo {1..12}/01
и попытался xargs
:
echo {1..12}/01 | xargs -n 1 -I {} date -d {} +%b
Но это с треском проваливается: / (потом я хотел бы подать заявку mkdir
). Как я могу это сделать?
shell-script
xargs
bash-expansion
JammingThebBits
источник
источник
ls
в алфавитном порядке (апр, август, декабрь, февраль, январь, июль, июнь, мар, май, ноябрь, октябрь, сентябрь).mkdir january february [...]
? Если вам действительно не нужно создавать их отдельно, нет необходимости делать это так, как вы предлагали.Ответы:
С
-I
,xargs
получает по одному аргументу на строку, в отличие от значения по умолчанию одного аргумента на слово-I
( без пробелов или с новой строкой, возможно, в кавычках) без (и подразумевается-n
) Таким образом, в вашем примереdate
вызывается только один раз с{}
расширением на весь выводecho
(который находится на одной строке), минус завершающий перевод строки.Здесь вы можете сделать (обратите внимание, что
-d
это расширение GNU):(обратите внимание, что он не будет работать правильно в локалях, где сокращения названий месяцев содержат пробелы или символы кавычек; с GNU
xargs
вы можете обойти это, используяxargs -d '\n' mkdir --
)Теперь, чтобы получить список аббревиатур месяца в вашей локали, непосредственный запрос локали имеет смысл:
(см. также,
locale -k LC_TIME
чтобы увидеть все данные локали вLC_TIME
категории).Или изначально в
zsh
:По крайней мере, в системах GNU, в некоторых регионах аббревиатуры месяцев дополняются до фиксированной ширины пробелами:
Вы можете удалить это дополнение.
Ведущие места будут удалены
xargs -I
, но не последними. Сzsh
:источник
locale abmon
.IFS=';'; set -o noglob; mkdir -- $(locale abmon)
. ;)Попробуйте петлю?
Если вы хотите сделать каталог для каждого месяца, я бы сделал что-то вроде:
источник
{1..12}
это башизм. Для оболочки POSIX используйтеfor m in $(seq 1 12)...
(хотя обратите внимание, чтоseq
сама POSIX не является обязательной){1..12}
это zshism, скопированный позже ksh93, bash и несколькими другими оболочками.В оболочках с расширением скобок и датой, принимающей ввод данных, попробуйте
и труба в раковину, если доволен результатом.
источник
Ваша команда не работает, из-за использования
-I
изменений разделитель xargs:Вы можете добавить
-d " "
в xargs, чтобы он работал. Но вам даже не нужно-I{}
в вашем случае:Попробуй это,
источник
date
мог принимать параметры после не аргументов, подобных этому,POSIXLY_CORRECT
в среде не должно быть переменной.Ты где так близко.
Проблема в том, что echo создает одну строку
1/01 2/01 3/01 4/01 5/01 6/01 7/01 8/01 9/01 10/01 11/01 12/01
, а xargs использует символ новой строки в качестве разделителя полей (а не пробел).Решение: Скажите эхо, чтобы поставить пробел между каждым полем.
echo -e {1..12}/01\\n | xargs -n 1 -I {} date -d {} +%b
Я вставил только
\\n
в конце эха.Затем сделать каталоги добавить
|xargs mkdir
например
echo -e {1..12}/01\\n | xargs -n 1 -I {} date -d {} +%b | xargs mkdir
источник
Самый простой и надежный способ сделать это:
В конце концов, это статичный список месяцев ...
Если вы намереваетесь использовать GNU
date
(здесь предполагается, что неизменным$IFS
и GNU,date
как для вашегоdate -d
):источник