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

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

1
задан 10 February 2016 в 15:52

5 ответов

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

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

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 до [ f4]. то же, что и 4, но с текущей датой в качестве каталога и 1,2,3 в нем. то же, что и 4, но с текущим пользователем в качестве каталога и 1,2,3 в нем.

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

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

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

118
ответ дан 23 May 2018 в 13:39
  • 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

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

Websites/
  static/
      cs
      js
  templates/
      html

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

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

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

12
ответ дан 23 May 2018 в 13:39
  • 1
    Вы также можете нажать вкладку, чтобы развернуть их перед запуском команды. – Isaac Gregson 25 March 2017 в 07:42

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

mkdir `cat list`

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

10
ответ дан 23 May 2018 в 13:39
  • 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

Что-то вроде этого? (спасибо 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
ответ дан 23 May 2018 в 13:39

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

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

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

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