Я хотел бы создать много каталогов, используя mkdir
. Каждое имя каталога будет состоять из префикса (строка) и индекса (целое число). Предположим, что я бы хотел, чтобы префикс был «s», а индексы - от 1 до 50. Это означает, что я хотел бы создать каталоги под названием:
s1
, s2
... s49
,,s50
Есть ли способ сделать это автоматически с помощью mkdir
? Спасибо за ваше время.
bash
. Спасибо за уделенное время!s01
,s02
, ...,s49
,s50
. Если бы я использовал индексы фиксированной ширины, то/bin/ls
почти всегда создавал нужный мне порядок.Ответы:
Вы можете сделать это с помощью сценария оболочки.
Pure sh - это будет работать даже на скоропортящихся оболочках POSIX:
Если вы хотите создать большое количество каталогов, вы можете сделать скрипт быстрее, сократив его до одного вызова,
mkdir
а также используя встроенные функции оболочки для тестирования и арифметики. Как это:Zsh, ksh93 или bash делают это намного проще, но я должен отметить, что это не встроено
mkdir
и может не работать в других оболочках. В более крупных случаях это также может зависеть от ограничений на количество или общий размер аргументов, которые могут быть переданы команде.источник
n=$(( n + 1 ))
я бы точно так же строго придерживался POSIX и не стоил бы вам недоработки.[[
ключевое слово не POSIX. (Не говоря уже о том , что[
это оболочка встроенный во многих современных оболочках.)[[
работает на моемksh88
(который предшествуетbash
), поэтому я предположил, что это был POSIX. Я не смог найти упоминаний об этом в спецификации POSIX, поэтому я верю, что вы правы. Спасибо за информацию!for i in {range}
для пользователей расширенных оболочек.Один
Два
Эта опция работает в bash , zsh и ksh93
Три
источник
$i
чем просто создать каталог, напримерmkdir s$i ; echo $i > s$i/$i
. Кроме того, One - это хороший, простой пример использования цикла for в bash ... на таком сайте, как этот, совсем не маловероятно, чтобы начинающий пользователь увидел его и подумал: "хорошо, я не осознавал, что вы могли бы сделать это". "---> просветление.Здесь много сложных ответов, но bash делает это действительно легко. Конечно, чистое решение POSIX работает, но почему бы не воспользоваться преимуществами используемой
bash
вами оболочки? Вы можете сделать это легко с расширением скобки :источник
mkdir $(seq --format 's%.0f' 1 50)
или если вы хотите числа с нулями (что было бы лучше для сортировки):
mkdir $(seq --format 's%02.0f' 1 50)
или:
mkdir s$(seq -s ' s' -w 1 50)
- обратите внимание на строку 's' непосредственно перед$()
, без нее первый созданный каталог будет просто '01', а не 's01'и наконец:
mkdir $(printf "s%02i " $(seq 1 50))
seq
это от GNU Coreutilsкак ни странно, seq
--format
или-f
опция допускает только двойные типы с плавающей запятой в printf (например, f и g. также странный шестнадцатеричный формат с плавающей запятой, который я никогда не использовал). Понятия не имею почему. Было бы хорошо, если бы он также поддерживал другиеprintf(3)
числовые типы, такие как целое число (d, i), восьмеричное (o, U) или шестнадцатеричное (x, X).В любом случае, двойной формат с 0 десятичной точностью, например,
%.0f
или%02.0f
достаточно близок к целому числу для этой цели.Смотрите также: http://www.gnu.org/software/coreutils/manual/html_node/seq-invocation.html
источник
{1,50}
или{01,50}
(для заполнения нулями) намного проще и понятнее.Просто для отличия вот решение POSIX sh, которое использует рекурсию:
источник