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)?

BGroat
źródło
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
Jacob Vlijm
źródło
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.

Rinzwind
źródło
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

anas munir
źródło
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.

SpaceCadet
źródło
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
$ 
kos
źródło
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)
Sergiy Kolodyazhnyy
źródło
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
Vijay Sasvadiya
źródło