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

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

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

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

mkdir dir_1 dir_2

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

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

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. список, разделенный запятыми, содержит каталоги 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 и внутри каждого каталога 1, 2 и 3.

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

Websites/  static/      cs      js  templates/      html

Вы можете сделать это с помощью одной команды, подобной этой:

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

Будьте осторожны, чтобы не вводить какие-либо пробелы

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

mkdir `cat list`

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

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

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

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

function mkdir_cs {    printf '%s' "$1" | xargs -d, mkdir}
$ ls$ mkdir_cs 'foo,bar,baz'$ lsbar  baz  foo$ 

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

Оболочка + coreutils

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

DIR:/testdirskolodya@ubuntu:$ lsDIR:/testdirskolodya@ubuntu:$ mkdir $( tr '[,\n]' ' '   < /home/xieerqi/dirList.txt   )                                           DIR:/testdirskolodya@ubuntu:$ lsdirFive/  dirfour/  dirone/  dirthree/  dirtwo/

awk

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

DIR:/xieerqiskolodya@ubuntu:$ awk -F ',' '{for(i=1;i<=NF;i++) system("mkdir "$i)}' dirList.txt                                    DIR:/xieerqiskolodya@ubuntu:$ ls -ld dir*                                                                                         -rw-rw-r-- 1 xieerqi xieerqi   23 Feb  9 11:41 dirList.txtdrwxrwxr-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:/xieerqiskolodya@ubuntu:$ cat dirList.txt                                                                                     dirone,dirtwo,dirthree

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

Питон

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

DIR:/testdirskolodya@ubuntu:$ ls                                                                                                  DIR:/testdirskolodya@ubuntu:$ /home/xieerqi/makeDirs.py                                                                           DIR:/testdirskolodya@ubuntu:$ lsdirFive/  dirfour/  dirone/  dirthree/  dirtwo/DIR:/testdirskolodya@ubuntu:$ cat /home/xieerqi/makeDirs.py#!/usr/bin/env pythonimport oswith 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)

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

mkdir dir1 dir2 dir3 ... dirN

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

mkdir dir1 dir2/{subdir1,subdir2,subdir3,subdirN} dir3 dirN

Просто используйте аргумент -p:

mkdir -p app/code/Foo/Bar


Это то, о чем говорится на странице справки -p. Я бы не понял этого по этому тексту...

-p, --parents нет ошибки, если она существует, создайте родительские каталоги по мере необходимости

ман мкдир

Жаргон справочных страниц @JacobVlijm неочевиден без инструкций, но на техническом языке справочных страниц информация совершенно ясна, даже в приведенной цитате. Обратите внимание на ... после [DIRECTORY], что означает, что этот аргумент может быть повторен. Таким образом, “КАТАЛОГ (ы)” относится ко всем переданным аргументам “КАТАЛОГА”. Однако в комментариях “RTFM” иногда забывают, что есть обозначения, которые нужно выучить.

Каждый раз, когда вы хотите узнать, может ли команда выполнить то, что вы хотите, введите “man”, за которым следует название команды.

@JacobVlijm На справочной странице GNU coreutils 8.21 для mkdir написано: “ИМЯ mkdir - создание каталогов // ** КРАТКОЕ ОПИСАНИЕ** mkdir [ОПЦИЯ]… [КАТАЛОГ]… // ОПИСАНИЕ Создайте КАТАЛОГ(ы), если они еще не существуют.” Кажется довольно очевидным, что вы можете создать более одного каталога.

@DavidRicherby хотя “man mkdir” “вроде как” предполагает возможность создания нескольких каталогов одновременно, конкретно об этом не упоминается, равно как и о том, как это сделать.

@DavidRicherby, как я уже сказал * “предполагает возможность создания нескольких каталогов одновременно, это конкретно не упоминается, и как это сделать”*