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

79

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

    
задан BGroat 09.02.2016 в 19:30
источник

7 ответов

131

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

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

mkdir dir_1 dir_2
    
ответ дан Jacob Vlijm 09.02.2016 в 19:32
источник
126

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

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

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 и в пределах каждой директории 1, 2 и 3.

    
ответ дан Rinzwind 09.02.2016 в 19:49
17

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

Websites/
  static/
      cs
      js
  templates/
      html

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

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

Будьте внимательны, чтобы не вводить пробелы

    
ответ дан anas munir 23.09.2016 в 22:28
12

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

mkdir 'cat list'

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

    
ответ дан SpaceCadet 09.02.2016 в 23:53
8

Что-то вроде этого? (спасибо 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
$ 
    
ответ дан kos 09.02.2016 в 19:49
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) , но это может быть проблемой, если вы хотите создать каталоги с пробелами в имени

Python

Pythonic способ сделать то же самое, будет читать каждую строку, избавиться от trailing \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)
    
ответ дан Sergiy Kolodyazhnyy 09.02.2016 в 19:44
0

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

mkdir dir1 dir2 dir3 ... dirN

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

mkdir dir1 dir2/{subdir1, subdir2, subdir3, subdirN} dir3 dirN
    
ответ дан Vijay Sasvadiya 20.07.2018 в 08:38