Czy istnieje sposób na utworzenie wielu katalogów jednocześnie za pomocą mkdir?


112

Czy chciałbym utworzyć wiele katalogów (na tym samym poziomie), a następnie podać listę nazw katalogów oddzielonych przecinkami (lub coś w tym celu)?


38
man mkdir....
— Sparhawk

5
Za każdym razem, gdy chcesz się dowiedzieć, czy polecenie może zrobić coś, co chcesz zrobić, wpisz mannazwę i nazwę polecenia.
— David Richerby,

@DavidRicherby, chociaż man mkdir„rodzaj” sugeruje możliwość tworzenia wielu katalogów naraz, nie jest to specjalnie wspomniane, ani jak to zrobić.
— Jacob Vlijm

2
@JobobVlijm Strona podręcznika GNU coreutils 8.21 dla mkdir mówi: „ NAZWA mkdir - twórz katalogi // SKŁADNIA mkdir [OPCJA] ... [KATALOG] ... // OPIS Utwórz KATALOG, jeśli jeszcze nie istnieje”. Wydaje się całkiem jasne, że możesz utworzyć więcej niż jeden katalog.
— David Richerby,

9
@JacobVlijm Żargon stron Man nie jest oczywisty bez instrukcji, ale w technicznym języku stron man informacje są całkowicie jasne, nawet w danym cytacie. Zwróć uwagę na ...później [DIRECTORY], co oznacza, że ​​argument można powtórzyć. DIRECTORY(ies)Odnosi się więc do wszystkich przekazanych DIRECTORYargumentów. Jednak komentarze „RTFM” czasami zapominają, że należy się czegoś nauczyć.
— Blaisorblade,

Odpowiedzi:


147

Krótka odpowiedź

mkdir bierze wiele argumentów, po prostu uruchom

mkdir dir_1 dir_2

152

Możesz używać list do tworzenia katalogów, a to może być dość dzikie.

Kilka przykładów, aby ludzie o tym pomyśleli:

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 katalogów od sa1 do sa50
  2. tak samo, ale każdy z katalogów pomieści 50 razy od sax1 do sax50 (-p utworzy katalogi nadrzędne, jeśli nie istnieją.
  3. 26 katalogów od a12345 do z12345
  4. Lista rozdzielona przecinkami tworzy katalog 1, 2 i 3.
  5. 10 katalogów od test01do test10.
  6. taki sam jak 4, ale z bieżącą datą jako katalog i 1,2,3 w nim.
  7. tak samo jak 4, ale z bieżącym użytkownikiem jako katalogiem i 1,2,3 w nim.

Tak więc, jeśli dobrze to zrozumiałem i chcesz utworzyć niektóre katalogi, aw nich nowe katalogi, możesz to zrobić:

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

i uzyskaj sa1, sa2, ..., sa10 oraz w każdym katalogu 1, 2 i 3.


Zgadzam się z @ gniourf_gniourf… w twojej odpowiedzi nie ma użycia wyrażeń regularnych. Czy chciałeś powiedzieć coś innego, czy dać inny przykład?
— Slipp D. Thompson,

1
@gniourf_gniourf gotowe :)
— Rinzwind

3
Warto wspomnieć, że rozszerzenie nawiasu klamrowego nie jest zdefiniowane w powłoce POSIX: pubs.opengroup.org/onlinepubs/9699919799/utilities/… Na przykład nie zadziała, w dashktórym jest domyślną wersją/bin/sh Ubuntu.
— pabouk

7
Ta odpowiedź zależy od tego, czy powłoka rozszerzy dane wejściowe, zanim poda je jako argumenty do mkdir . O wiele dokładniej jest powiedzieć, że mkdir może tworzyć wiele katalogów z wieloma argumentami, a następnie mówić o tym, jak dana powłoka może to ułatwić.
— deed02392

Jeśli spróbuję zrobić coś takiego mkdir sa$(seq 0.1 0.1 1), wystarczy utworzyć jeden katalog o nazwie sa0.1, a pozostałe 0.2, 0.3, ..., 1. Jak uzyskać dziesiętne rozwinięcie nawiasu bez zapisywania całej listy?
— Cokół

26

To bardzo proste, pozwala stworzyć strukturę katalogów, taką jak:

Websites/
  static/
      cs
      js
  templates/
      html

Możesz to zrobić za pomocą jednego polecenia, takiego jak to:

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

Uważaj, aby nie wprowadzić żadnych spacji


Możesz także nacisnąć klawisz tab, aby je rozwinąć przed uruchomieniem polecenia.
— Isaac Gregson

14

Zrób listę nazw żądanych katalogów, używając podziału wierszy zamiast przecinków jako separatora. Zapisz tę listę.

mkdir `cat list`

Powinieneś teraz mieć wszystkie katalogi wymienione na liście.


1
Tak, będzie to jednak działać z zastrzeżeniem - nazwy katalogów muszą być jednym ciągiem. Jeśli jedna linia to spaced dir, utworzy dwa katalogi spacedi `katalog.
— Sergiy Kolodyazhnyy

Tak - nie można nawet z powodzeniem uciec do spacji - junk\ dirw listpliku podano dwa katalogi junk\ i dir. Wpadłem w panikę, kiedy zobaczyłem \ w nazwie katalogu.
— Jon V

Można to połączyć z -pflagą wymienioną w innych odpowiedziach. Jeśli tak, listplik nie musi zawierać katalogów nadrzędnych jako własnych linii, zostaną one wykryte i utworzone automatycznie.
— mcw0933,

8

Coś takiego? (dzięki Muru za printfwskazówkę)

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

Możesz zawinąć w funkcję ułatwiającą obsługę:

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

1
Wystarczy a printf "%s" "$1" | xargs -d, mkdirpowinno wystarczyć.
— muru

7

Więc chcesz listę nazw katalogów oddzieloną przecinkami? Można to zrobić.

Shell + Coreutils

Ponieważ wszyscy publikują onelinerów, tutaj też jest mój (mkdir + podstawienie parametrów plus + przekierowanie powłoki).

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 jest językiem przetwarzania tekstu, ale ma bardzo przyjemną system()funkcję, która wywoła domyślną powłokę i uruchomi polecenia zawarte w nawiasach (które muszą być ciągiem znaków).

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

Lub możesz usunąć za ,pomocą gsub()funkcji i wywołać, system("mkdir "$0)ale może to stanowić problem, jeśli chcesz utworzyć katalogi ze spacjami w nazwie

Pyton

Pythonicznym sposobem na zrobienie tego samego byłoby odczytanie każdej linii, pozbycie się spływu \n, pchnięcie wszystkiego do jednej listy, iterowanie elementów listy i tworzenie katalogów według pozycji listy. Zauważ, że w poniższym przykładzie /home/xieerqi/dirList.txtpodano pełną ścieżkę do mojego pliku i tworzymy pełną ścieżkę każdego nowego katalogu, łącząc ciąg znaków /home/username/i nazwę katalogu odczytaną z listy. W razie potrzeby zastąp własne wartości

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
Nie sądzę, aby pytający faktycznie chciał, aby lista była oddzielona przecinkami; Jestem pewien, że to tylko ich przypuszczenie na temat składni.
— David Richerby,

Cóż, OP prawdopodobnie nie miał dokładnie listy oddzielonej przecinkami, ale z pewnością może być użyty jako metoda, wskazując, że „można również użyć list, nie trzeba wpisywać nazwy każdego katalogu osobno”. Jest to szczególnie przydatne, gdy nie można wygenerować dużej listy z zakresami, np dir{1..1000}. Powiedzmy, że chcesz utworzyć katalog według nazwy użytkownika, projektu lub lokalizacji geograficznej, na przykład miasta
— Sergiy Kolodyazhnyy

1

Komenda mkdir wymaga wielu argumentów, wystarczy uruchomić jak poniżej

mkdir dir1 dir2 dir3 ... dirN

Jeśli chcesz utworzyć wiele podkatalogów, możesz przekazać te argumenty w {}, jak pokazano poniżej (użyj tylko przecinków, aby oddzielić argument, bez spacji).

mkdir dir1 dir2/{subdir1,subdir2,subdir3,subdirN} dir3 dirN
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.