Чи є спосіб створити декілька каталогів одночасно за допомогою mkdir?


112

Якщо я хотів створити декілька каталогів (на одному рівні), а потім подати йому відокремлений комою список імен каталогів (чи щось для цього)?


38
man mkdir....
Sparhawk

5
Коли ви хочете дізнатися, чи може команда виконувати якусь дію, яку ви хочете зробити, введіть manнаступну назву команди.
Девід Річербі

@DavidRicherby, хоча man mkdir"вид" пропонує можливість створювати декілька каталогів одночасно, конкретно не згадується, як і як це зробити.
Яків Влійм

2
@JacobVlijm ГНУ Coreutils 8.21 на сторінку Довідника MkDir каже, " NAME MkDir - зробити директорії // синтаксису MKDIR [OPTION] ... [каталог] ... // ОПИС Створіть каталог (ІЕ) , якщо вони ще не існують." Здається, цілком зрозуміло, що ви можете зробити більше одного каталогу.
Девід Річербі

9
@JacobVlijm Немає очевидних жаргонних сторінок без інструкцій, але в технічній мові на сторінках man інформація повністю зрозуміла навіть у наведеній цитаті. Зверніть увагу на ...після [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.


Я погоджуюся з @ gniourf_gniourf ... у вашій відповіді немає використання регулярних виразів. Ви мали на увазі сказати щось інше чи навести інший приклад?
Сліп Д. Томпсон

1
@gniourf_gniourf done :)
Rinzwind

3
Варто згадати, що розширення дужок у не визначено в оболонці POSIX: pubs.opengroup.org/onlinepubs/9699919799/utilities/… Наприклад, воно не буде працювати, в dashякому /bin/shUbuntu є типовим для Ubuntu.
пабук

7
Ця відповідь залежить від оболонки, яка виконує розширення вашого вводу, перш ніж надати цей вхід як аргумент mkdir . Набагато точніше сказати, що mkdir може створити декілька dirs з декількома аргументами, а потім поговорити про те, як дана оболонка може зробити це простіше.
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}

Будьте обережні, щоб не зайти в пробіли


Ви також можете натиснути вкладку тут, щоб розгорнути їх перед запуском команди.
Ісаак Грегсон

14

Складіть список імен потрібних каталогів, використовуючи розриви рядків замість коми як роздільник. Збережіть цей список.

mkdir `cat list`

Тепер у вашому списку мають бути названі всі каталоги.


1
Так, це спрацює, однак, із застереженням - назви каталогів мають бути цілими рядками. Якщо один рядок spaced dir, то він створить два spaceddir та `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)але це може бути проблемою , якщо ви хочете створити каталоги з пробілами в назві

Пітон

Пітонічним способом зробити те саме, було б прочитати кожен рядок, позбутися від трейлінгу \n, зсунути все в один список, а також переглядати пункти списку та створювати рядки для кожного списку. Зауважте, що в наведеному нижче прикладі /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
Я не думаю, що запитувач насправді хоче, щоб список розділявся комами; Я майже впевнений, що це було лише їх здогадка про те, яким може бути синтаксис.
Девід Річербі

Добре, що в ОП, мабуть, точно не було відокремленого комою списку, проте він, безумовно, може бути використаний як метод, вказуючи на те, що "списки також можуть бути використані, вам не потрібно вводити назву кожного dir окремо". Особливо це буде корисно, коли великий список не може бути створений, наприклад, діапазонами dir{1..1000}. Скажімо, ви хочете скласти каталог за іменем користувача, або за проектом, або за географічним розташуванням, як місто
Сергій Колодяжний

1

Команда mkdir приймає кілька аргументів, просто виконайте наступні дії

mkdir dir1 dir2 dir3 ... dirN

Якщо ви хочете створити кілька підкаталогів, ви можете передати ці аргументи в {}, як показано нижче (використовуйте лише коми для розділення аргументу без пробілів).

mkdir dir1 dir2/{subdir1,subdir2,subdir3,subdirN} dir3 dirN
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.