Есть ли способ создать несколько каталогов одновременно с помощью mkdir?

112

Если бы я хотел создать несколько каталогов (на одном уровне), а затем передать ему список имен каталогов через запятую (или что-то в этом роде)?

BGroat
источник
38
man mkdir....
Sparhawk
5
В любое время, когда вы захотите узнать, может ли команда сделать то, что вы хотите, введите manкоманду и ее имя.
Дэвид Ричерби
@DavidRicherby, хотя man mkdir«вид» предполагает возможность создания нескольких каталогов одновременно, конкретно не упоминается, ни как это сделать.
Джейкоб Влейм
2
@JacobVlijm ГНУ Coreutils 8.21 на страницу Справочника MkDir говорит, " NAME MkDir - сделать директории // СИНТАКСИСА MKDIR [OPTION] ... [каталог] ... // ОПИСАНИЕ Создайте каталог (ИЭ) , если они еще не существуют." Это кажется довольно ясным, что вы можете создать более одного каталога.
Дэвид Ричерби
9
@JacobVlijm Жаргон справочных страниц не очевиден без инструкций, но на техническом языке справочных страниц информация полностью ясна даже в данной цитате. Обратите внимание на ...после [DIRECTORY], означая, что аргумент может быть повторен. Так DIRECTORY(ies)относится ко всем переданным DIRECTORYаргументам. Однако в комментариях «RTFM» иногда забывают, что есть нотация для изучения.
Blaisorblade

Ответы:

147

Краткий ответ

mkdir принимает несколько аргументов, просто запустите

mkdir dir_1 dir_2
Якоб Влейм
источник
152

Вы можете использовать списки для создания каталогов, и это может быть довольно диким.

Несколько примеров, чтобы заставить людей задуматься об этом:

mkdir sa{1..50}
mkdir -p sa{1..50}/sax{1..50}
mkdir {a-z}12345 
mkdir {1,2,3}
mkdir test{01..10}
mkdir -p `date '+%y%m%d'`/{1,2,3} 
mkdir -p $USER/{1,2,3} 
  1. 50 каталогов от sa1 до sa50
  2. то же самое, но каждый из каталогов будет содержать 50 раз от sax1 до sax50 (-p создаст родительские каталоги, если они не существуют.
  3. 26 каталогов от a12345 до z12345
  4. Разделенный запятыми список составляет dirs 1, 2 и 3.
  5. 10 каталогов из test01сквозного test10.
  6. то же, что 4, но с текущей датой в качестве каталога и 1,2,3 в нем.
  7. то же, что 4, но с текущим пользователем в качестве каталога и 1,2,3 в нем.

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

mkdir -p sa{1..10}/{1,2,3}

и получите sa1, sa2, ..., sa10 и в каждом dirs 1, 2 и 3.

Rinzwind
источник
Я согласен с @ gniourf_gniourf ... в вашем ответе нет регулярных выражений. Вы хотели сказать что-то еще или привести другой пример?
Слипп Д. Томпсон
1
@gniourf_gniourf готово :)
Rinzwind
3
Стоит отметить, что расширение скобки не определено в оболочке POSIX: pubs.opengroup.org/onlinepubs/9699919799/utilities/… Например, оно не будет работать, в dashкотором по умолчанию используется /bin/shUbuntu.
Пабук
7
Этот ответ зависит от того, как оболочка выполняет расширение вашего ввода перед тем, как предоставить этот ввод в качестве аргументов mkdir . Гораздо точнее просто сказать, что mkdir может создать несколько каталогов с несколькими аргументами, а затем рассказать о том, как данная оболочка может сделать это проще.
deed02392
Если я пытаюсь сделать что-то вроде этого mkdir sa$(seq 0.1 0.1 1), все, что он делает, это создает один каталог с именем sa0.1, а остальные 0.2, 0.3, ..., 1. Как я могу получить десятичную скобку без записи всего списка?
Плинтус
26

Это очень просто, позволяет вам создать структуру каталогов, такую ​​как:

Websites/
  static/
      cs
      js
  templates/
      html

Вы можете сделать это одной командой:

mkdir -p Website/{static/{cs,js},templates/html}

Будьте осторожны, чтобы не войти в любые пробелы

Анас Мунир
источник
Вы также можете нажать Tab, чтобы развернуть их перед запуском команды.
Исаак Грегсон
14

Составьте список имен для желаемых каталогов, используя разрывы строк вместо запятых в качестве разделителя. Сохраните этот список.

mkdir `cat list`

Теперь у вас должны быть все каталоги, названные в вашем списке.

Космический кадет
источник
1
Да, это будет работать, однако, с оговоркой - имена каталогов должны быть одной целой строкой. Если одна строка есть spaced dir, то она создаст два dirs spacedи `dir.
Сергей Колодяжный
Да - вы даже не можете успешно сделать какой-либо способ экранирования пробелов - junk\ dirв listфайле есть две директории, junk\ и dir. Дали мне панику, когда я увидел \ в названии каталога.
Джон V
Это может быть объединено с -pфлагом, упомянутым в других ответах. Если это так, listфайл не должен включать родительские каталоги в качестве своих собственных строк, они будут обнаружены и созданы автоматически.
mcw0933
8

Что-то вроде этого? (спасибо Муру за printfподсказку)

printf '%s' 'foo,bar,baz' | xargs -d, mkdir
$ ls
$ printf '%s' 'foo,bar,baz' | xargs -d, mkdir
$ ls
bar  baz  foo
$ 

Вы можете включить его в функцию для удобства использования:

function mkdir_cs {
    printf '%s' "$1" | xargs -d, mkdir
}
$ ls
$ mkdir_cs 'foo,bar,baz'
$ ls
bar  baz  foo
$ 
кос
источник
1
Просто printf "%s" "$1" | xargs -d, mkdirдолжно быть достаточно.
Муру
7

Итак, вы хотите разделить запятыми список имен каталогов? Это можно сделать.

Shell + coreutils

Так как все публикуют oneliners, вот и мой (mkdir + подстановка параметров плюс + перенаправление оболочки).

DIR:/testdir
skolodya@ubuntu:$ ls

DIR:/testdir
skolodya@ubuntu:$ mkdir $( tr '[,\n]' ' '   < /home/xieerqi/dirList.txt   )                                           

DIR:/testdir
skolodya@ubuntu:$ ls
dirFive/  dirfour/  dirone/  dirthree/  dirtwo/

AWK

AWK - это язык обработки текста, но у него есть очень хорошая system()функция, которая будет вызывать оболочку по умолчанию и запускать команду [s], заключенную в круглые скобки (которая должна быть строкой).

DIR:/xieerqi
skolodya@ubuntu:$ awk -F ',' '{for(i=1;i<=NF;i++) system("mkdir "$i)}' dirList.txt                                    

DIR:/xieerqi
skolodya@ubuntu:$ ls -ld dir*                                                                                         
-rw-rw-r-- 1 xieerqi xieerqi   23 Feb  9 11:41 dirList.txt
drwxrwxr-x 2 xieerqi xieerqi 4096 Feb  9 11:42 dirone/
drwxrwxr-x 2 xieerqi xieerqi 4096 Feb  9 11:42 dirthree/
drwxrwxr-x 2 xieerqi xieerqi 4096 Feb  9 11:42 dirtwo/

DIR:/xieerqi
skolodya@ubuntu:$ cat dirList.txt                                                                                     
dirone,dirtwo,dirthree

Или вы можете удалить ,с помощью gsub()функции и вызвать, system("mkdir "$0)но это может быть проблемой, если вы хотите создать каталоги с пробелами в их имени

питон

Pythonic способ сделать то же самое, состоял бы в том, чтобы прочитать каждую строку, избавиться от конечного \n, сложить все в один список, итерировать по элементам списка и создавать dirs для каждого элемента списка. Обратите внимание, что в приведенном ниже примере /home/xieerqi/dirList.txtуказан полный путь к моему файлу, и мы создаем полный путь к каждому новому каталогу, объединяя строку /home/username/и имя dir, прочитанное из списка. Подставьте свои собственные ценности по мере необходимости

DIR:/testdir
skolodya@ubuntu:$ ls                                                                                                  

DIR:/testdir
skolodya@ubuntu:$ /home/xieerqi/makeDirs.py                                                                           

DIR:/testdir
skolodya@ubuntu:$ ls
dirFive/  dirfour/  dirone/  dirthree/  dirtwo/

DIR:/testdir
skolodya@ubuntu:$ cat /home/xieerqi/makeDirs.py
#!/usr/bin/env python
import os
with open("/home/xieerqi/dirList.txt") as file:
   for line in file:
         for directory in line.strip().rsplit(','):
             path = '/home/xieerqi/testdir/' +  directory
             os.makedirs(path)
Сергей Колодяжный
источник
3
Я не думаю, что спрашивающий действительно хочет, чтобы список был разделен запятыми; Я почти уверен, что это было их предположение о том, какой может быть синтаксис.
Дэвид Ричерби
Что ж, у OP, вероятно, не было точно списка, разделенного запятыми, однако он наверняка может быть использован в качестве метода, но суть в том, что «списки также могут быть использованы, вам не нужно вводить имя каждого каталога отдельно». Особенно это будет полезно, когда большой список не может быть создан с диапазонами, например dir{1..1000}. Скажем, вы хотите создать каталог по имени пользователя, по проекту или по географическому местоположению, например по городу
Сергей Колодяжный
1

Команда mkdir принимает несколько аргументов, просто запустите, как показано ниже

mkdir dir1 dir2 dir3 ... dirN

Если вы хотите создать несколько подкаталогов, вы можете передать эти аргументы в {}, как показано ниже (используйте только запятые для разделения аргумента без пробелов).

mkdir dir1 dir2/{subdir1,subdir2,subdir3,subdirN} dir3 dirN
Виджай Сасвадия
источник