Как быстро создать несколько каталогов? [dубликат]

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

79
задан Pabru 10 February 2016 в 15:52
поделиться

62 ответа

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

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

mkdir dir_1 dir_2
125
ответ дан Jacob Vlijm 17 July 2018 в 22:12
поделиться

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

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

mkdir dir_1 dir_2
125
ответ дан Jacob Vlijm 23 July 2018 в 22:51
поделиться
126
ответ дан Jacob Vlijm 31 July 2018 в 19:41
поделиться
126
ответ дан Jacob Vlijm 2 August 2018 в 12:43
поделиться
126
ответ дан Jacob Vlijm 3 August 2018 в 17:06
поделиться
126
ответ дан Jacob Vlijm 5 August 2018 в 02:23
поделиться
126
ответ дан Jacob Vlijm 6 August 2018 в 19:04
поделиться
127
ответ дан Jacob Vlijm 8 August 2018 в 23:25
поделиться
127
ответ дан Jacob Vlijm 14 August 2018 в 13:43
поделиться

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

Websites/ static/ cs js templates/ html

Вы можете сделать это в одной команде следующим образом:

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

Be осторожно, чтобы не вводить пробелы

14
ответ дан anas munir 17 July 2018 в 22:12
поделиться

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

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

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} 50 каталогов от sa1 до sa50 но каждая из каталогов будет содержать 50 раз sax1 через sax50 (-p создаст родительские каталоги, если их не существует). 26 каталогов из списка с разделителями-запятыми от a12345 до z12345 делают dirs 1, 2 и 3. 10 каталогов с test01 до test10. то же, что и 4, но с текущей датой в качестве каталога и 1,2,3 в нем. то же, что и 4, но с текущим пользователем в качестве каталога и 1,2,3 в нем.

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

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

и получить sa1, sa2, ..., sa10 и внутри каждый из них 1, 2 и 3.

122
ответ дан edwinksl 17 July 2018 в 22:12
поделиться

Что-то вроде этого? (спасибо muru для наконечника 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 $
8
ответ дан kos 17 July 2018 в 22:12
поделиться

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

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/

Shell + coreutils

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), но это может быть проблемой, если вы хотите создать каталоги с пробелами в их имени

Python

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)
7
ответ дан Sergiy Kolodyazhnyy 17 July 2018 в 22:12
поделиться

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

mkdir `cat list`

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

10
ответ дан SpaceCadet 17 July 2018 в 22:12
поделиться

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

Websites/ static/ cs js templates/ html

Вы можете сделать это в одной команде следующим образом:

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

Be осторожно, чтобы не вводить пробелы

16
ответ дан anas munir 23 July 2018 в 22:51
поделиться
  • 1
    Вы также можете нажать вкладку, чтобы развернуть их перед запуском команды. – Isaac Gregson 25 March 2017 в 07:42

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

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

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} 50 каталогов от sa1 до sa50 но каждая из каталогов будет содержать 50 раз sax1 через sax50 (-p создаст родительские каталоги, если их не существует). 26 каталогов из списка с разделителями-запятыми от a12345 до z12345 делают dirs 1, 2 и 3. 10 каталогов с test01 до test10. то же, что и 4, но с текущей датой в качестве каталога и 1,2,3 в нем. то же, что и 4, но с текущим пользователем в качестве каталога и 1,2,3 в нем.

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

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

и получить sa1, sa2, ..., sa10 и внутри каждый из них 1, 2 и 3.

123
ответ дан edwinksl 23 July 2018 в 22:51
поделиться
  • 1
    Я согласен с @ gniourf_gniourf ... в вашем ответе нет регулярных выражений. Вы имели в виду сказать что-то еще или представить другой пример? – Slipp D. Thompson 10 February 2016 в 08:02
  • 2
    @gniourf_gniourf сделано :) – Rinzwind 10 February 2016 в 11:35
  • 3
    Стоит отметить, что расширение скобки не определено в оболочке POSIX: pubs.opengroup.org/onlinepubs/9699919799/utilities/… Например, он не будет работать в dash, который по умолчанию /bin/sh на Ubuntu. – pabouk 10 February 2016 в 13:19
  • 4
    Этот ответ зависит от того, как оболочка расширяет ваш вход, прежде чем предоставлять этот вход в качестве аргументов в mkdir . Гораздо точнее сказать, что mkdir может создавать несколько dirs с несколькими аргументами и , тогда расскажет о том, как данная оболочка может сделать это проще. – deed02392 11 February 2016 в 09:55
  • 5
    Если я попытаюсь сделать что-то вроде mkdir sa$(seq 0.1 0.1 1), все, что он делает, это создать один каталог с именем sa0.1, а остальные 0.2, 0.3, ..., 1. Как я могу получить расширение десятичной скобки без написания всего списка? – Plinth 4 January 2017 в 03:57

Что-то вроде этого? (спасибо muru для наконечника 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 $
8
ответ дан kos 23 July 2018 в 22:51
поделиться

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

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/

Shell + coreutils

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), но это может быть проблемой, если вы хотите создать каталоги с пробелами в их имени

Python

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)
7
ответ дан Sergiy Kolodyazhnyy 23 July 2018 в 22:51
поделиться
  • 1
    Я не думаю, что искатель на самом деле хочет, чтобы список был разделен запятой; Я почти уверен, что это была их догадка о синтаксисе. – David Richerby 10 February 2016 в 22:23
  • 2
    Вероятно, OP, вероятно, не имел точно разделенного запятыми списка, однако он может быть использован как метод, точка которого & quot; списки могут также использоваться, вы не должны набирать имя каждого каталога в отдельности & quot ;. Особенно это будет полезно, когда большой список не может быть сгенерирован с диапазонами, например dir{1..1000}. Скажем, вы хотите создать каталог для каждого имени пользователя или для каждого проекта или для каждого географического местоположения, например город – Sergiy Kolodyazhnyy 10 February 2016 в 22:46

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

mkdir `cat list`

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

11
ответ дан SpaceCadet 23 July 2018 в 22:51
поделиться
  • 1
    Хороший. Не думаю, что я видел это раньше: D +1 – Rinzwind 10 February 2016 в 16:43
  • 2
    Да, это будет работать, однако, с оговоркой - имена каталогов должны быть целыми целыми. Если одна строка spaced dir, то она создаст два dirs, spaced и `dir. – Sergiy Kolodyazhnyy 10 February 2016 в 22:41
  • 3
    Да - вы даже не можете успешно выполнять какие-либо экранирования для пробелов, либо - junk\ dir в файле list дает два каталога, junk\ и dir. Дал мне панику, когда увидел имя \ в имени каталога. – Jon V 11 February 2016 в 04:02
  • 4
    Это можно комбинировать с флагом -p, указанным в других ответах. Если это так, файл list не должен включать родительские каталоги в качестве собственных строк, они будут обнаружены и создаются автоматически. – mcw0933 20 July 2018 в 17:19

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

mkdir dir1 dir2 dir3 ... dirN

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

mkdir dir1 dir2/{subdir1, subdir2, subdir3, subdirN} dir3 dirN
0
ответ дан Vijay Sasvadiya 23 July 2018 в 22:51
поделиться
11
ответ дан SpaceCadet 31 July 2018 в 19:41
поделиться
0
ответ дан Vijay Sasvadiya 31 July 2018 в 19:41
поделиться
123
ответ дан edwinksl 31 July 2018 в 19:41
поделиться
8
ответ дан kos 31 July 2018 в 19:41
поделиться
7
ответ дан Sergiy Kolodyazhnyy 31 July 2018 в 19:41
поделиться
16
ответ дан anas munir 31 July 2018 в 19:41
поделиться
16
ответ дан anas munir 2 August 2018 в 12:43
поделиться
123
ответ дан edwinksl 2 August 2018 в 12:43
поделиться
8
ответ дан kos 2 August 2018 в 12:43
поделиться
7
ответ дан Sergiy Kolodyazhnyy 2 August 2018 в 12:43
поделиться

Другие вопросы по тегам:

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