Создание многочисленных каталогов с использованием mkdir

Я хотел бы создать много каталогов, используя mkdir. Каждое имя каталога будет состоять из префикса (строки) и индекса (целого). Предположим, что я хотел бы, чтобы префикс был «s», а индексы варьировались от 1 до 50. Это означает, что я хотел бы создать каталоги под названием:

s1, s2,. .., s49, s50

Есть ли способ сделать это автоматически, используя mkdir? Спасибо за ваше время.

12 голосов | спросил Andrew 21 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 21 Sep 2012 02:20:51 +0400 2012, 02:20:51

5 ответов


29

Вы можете сделать это с помощью сценария оболочки.

Pure sh - это будет работать даже на ракетах pre-POSIX bourne:

n=1;
max=50;
while [ "$n" -le "$max" ]; do
  mkdir "s$n"
  n=`expr "$n" + 1`;
done

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

n=1
max=50
set -- # this sets [email protected] [the argv array] to an empty list.

while [ "$n" -le "$max" ]; do
    set -- "[email protected]" "s$n" # this adds s$n to the end of [email protected]
    n=$(( $n + 1 ));
done 

mkdir "[email protected]"

Zsh, ksh93 или bash делают это намного проще, но я должен отметить, что это не встроено в mkdir и может не работать в другие оболочки. В больших случаях на него могут также влиять ограничения на количество или общий размер аргументов, которые могут быть переданы команде.

mkdir s{1..50}
ответил Random832 21 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 21 Sep 2012 02:35:07 +0400 2012, 02:35:07
31
  • One

    for i in {1..50}; do
      mkdir s"$i"
    done
    
  • Два

    mkdir s{1..50}
    

    Эта опция работает в bash , zsh и ksh93

  • Три

    mkdir $(printf "s%02i " $(seq 1 50))
    
ответил Jhonathan 21 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 21 Sep 2012 02:30:37 +0400 2012, 02:30:37
7

Здесь много сложных ответов, но bash делает это очень просто. Конечно, чистое решение POSIX работает, но почему бы не использовать оболочку bash, которую вы используете, так или иначе? Вы можете сделать это легко с расширением брекета :

% mkdir -v s{1..10} && ls -1d s{1..10}                                   (09-24 17:37)
mkdir: created directory `s1'
mkdir: created directory `s2'
mkdir: created directory `s3'
mkdir: created directory `s4'
mkdir: created directory `s5'
mkdir: created directory `s6'
mkdir: created directory `s7'
mkdir: created directory `s8'
mkdir: created directory `s9'
mkdir: created directory `s10'
s1
s10
s2
s3
s4
s5
s6
s7
s8
s9
ответил laebshade 25 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 25 Sep 2012 02:39:18 +0400 2012, 02:39:18
5

mkdir $(seq --format 's%.0f' 1 50)

, или если вам нужны нулевые номера (что было бы лучше для сортировки):

mkdir $(seq --format 's%02.0f' 1 50)

или:

mkdir s$(seq -s ' s' -w 1 50) - обратите внимание на строку 'непосредственно перед $(), без него первый созданный каталог будет только '01', а не 's01'

и, наконец: mkdir $(printf "s%02i " $(seq 1 50))

seq от GNU Coreutils

странно, seq --format или -f позволяет использовать только двойные типы с плавающей запятой printf (например, f и g. также странный формат шестнадцатеричных чисел с плавающей запятой, который я никогда не использовал для использования). Понятия не имею почему. Было бы неплохо, если бы он также поддерживал другие printf(3) числовые типы, такие как integer (d, i), восьмеричные (o, U) или hex ( X, X).

В любом случае, двойной формат с 0 десятичной точностью, такой как %.0f или %02.0f достаточно близко к целому числу для этой цели.

$ seq --help
Использование: seq [OPTION] ... LAST
  или: seq [ОПЦИЯ] ... ПЕРВЫЙ ПОСЛЕДНИЙ
  или: seq [ВАРИАНТ] ... ПЕРВЫЙ ИНКРИМЕНТ ПОСЛЕДНИЕ
Напечатайте номера с FIRST до LAST, по шагам INCREMENT.

  -f, --format = FORMAT использовать FORMAT с плавающей запятой printf
  -s, --separator = STRING использовать STRING для разделения чисел (по умолчанию: \ n)
  -w, --equal-width выравнивать ширину путем заполнения с помощью начальных нулей
      --help отобразить эту справку и выйти
      - выходная версия версии и выход

Если FIRST или INCREMENT опущено, оно по умолчанию равно 1. То есть,
опущено значение INCREMENT по умолчанию равно 1, даже если LAST меньше FIRST.
FIRST, INCREMENT и LAST интерпретируются как значения с плавающей запятой.
INCREMENT обычно положителен, если FIRST меньше LAST, и
INCREMENT обычно отрицательный, если FIRST больше LAST.
FORMAT должен быть подходящим для печати одного аргумента типа `double ';
он по умолчанию равен% .PRECf, если FIRST, INCREMENT и LAST - все фиксированные точки
десятичные числа с максимальной точностью PREC и в% g в противном случае.

См. также: http://www.gnu.org/software/coreutils/пособие /html_node /сл-invocation.html

ответил cas 21 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 21 Sep 2012 03:53:51 +0400 2012, 03:53:51
4

Просто чтобы быть другим, вот решение POSIX sh, которое использует рекурсию:

makedirs() {
  [ "$1" -gt 0 ] || return
  mkdir "s$1"
  makedirs $(( $1 - 1 ))
}
$ makedirs 9
$ ls
s1  s2  s3  s4  s5  s6  s7  s8  s9
ответил kojiro 21 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 21 Sep 2012 09:08:47 +0400 2012, 09:08:47

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132