Intereting Posts
cifs записывают ошибки в работе cron Чтобы передать параметр с помощью sed Какой сервер tftp запущен Я не могу понять, как расширить мой домашний раздел Arch на свободное место package-cleanup –oldkernels не очистят старое ядро ​​3.x с установленным ядром 4.x Создайте несколько имен пользователей и UID в Linux с помощью сценария оболочки Как исправить ошибку «xrandr: не удается найти вывод« VGA1 »? найти символ и присоединиться к этой строке со следующей Как читать файл по строкам и печатать предыдущую строку, в которой файл содержит один токен Есть ли недостатки в использовании mount -bind в качестве замены символических ссылок? Микширование между учетной записью пользователя root и first non-root разбиение столбца с помощью awk Проблема с шрифтами с Debian 8.2 Arch Linux – NetworkManager не может настроить точку доступа Почему мой скрипт Python, установленный на пипсе, не является исполняемым для всех?

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

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

s1 , s2 , …, s49 , s50

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

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

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 $@ [the argv array] to an empty list. while [ "$n" -le "$max" ]; do set -- "$@" "s$n" # this adds s$n to the end of $@ n=$(( $n + 1 )); done mkdir "$@" 

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

 mkdir s{1..50} 
  • Один

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

     mkdir s{1..50} 

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

  • Три

     mkdir $(printf "s%02i " $(seq 1 50)) 

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

странно, опция --format или -f seq позволяет использовать только двойные типы с плавающей запятой 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/manual/html_node/seq-invocation.html

Чтобы быть другим, вот решение 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 

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

 % mkdir -vs{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