Gibt es eine Möglichkeit, mit mkdir mehrere Verzeichnisse gleichzeitig zu erstellen?

112

Wenn ich mehrere Verzeichnisse (auf der gleichen Ebene) erstellen und dann eine durch Kommas getrennte Liste von Verzeichnisnamen (oder etwas in diesem Sinne) einspeisen wollte?

BGroat
quelle
38
man mkdir....
Sparhawk
5
Wenn Sie wissen möchten, ob ein Befehl etwas kann, was Sie möchten, geben Sie mangefolgt vom Namen des Befehls ein.
David Richerby
@DavidRicherby Obwohl man mkdir"Art von" die Möglichkeit nahe legt, mehrere Verzeichnisse gleichzeitig zu erstellen, wird weder speziell erwähnt, noch wie dies getan werden soll.
Jacob Vlijm
2
@JacobVlijm In der Manpage zu GNU coreutils 8.21 für mkdir heißt es: " NAME mkdir - make directorys // ÜBERSICHT mkdir [OPTION] ... [DIRECTORY] ... // DESCRIPTION Erstelle das (die) DIRECTORY (s), falls es sie noch nicht gibt." Das scheint ziemlich klar, dass Sie mehr als ein Verzeichnis erstellen können.
David Richerby
9
@JacobVlijm Manpages Jargon ist nicht ohne Anweisung offensichtlich, aber in der technischen Sprache der Manpages sind die Informationen auch in dem angegebenen Zitat völlig klar. Beachten Sie das ...Nachher [DIRECTORY], was bedeutet, dass das Argument wiederholt werden kann. So DIRECTORY(ies)bezieht sich auf alle übergeben DIRECTORYArgumente. In "RTFM" -Kommentaren wird jedoch manchmal vergessen, dass eine Notation zu lernen ist.
Blaisorblade

Antworten:

147

Kurze Antwort

mkdir braucht mehrere Argumente, einfach ausführen

mkdir dir_1 dir_2
Jacob Vlijm
quelle
152

Sie können Listen verwenden, um Verzeichnisse zu erstellen, und es kann ziemlich wild werden.

Einige Beispiele, um die Leute zum Nachdenken zu bewegen:

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 Verzeichnisse von sa1 bis sa50
  2. gleich, aber jedes der Verzeichnisse enthält 50 mal sax1 bis sax50 (-p erstellt übergeordnete Verzeichnisse, wenn sie nicht existieren.
  3. 26 Verzeichnisse von a12345 bis z12345
  4. Durch Kommas getrennte Liste ergibt die Verzeichnisse 1, 2 und 3.
  5. 10 Verzeichnisse von test01bis test10.
  6. Wie 4, jedoch mit dem aktuellen Datum als Verzeichnis und 1,2,3 darin.
  7. Wie 4, aber mit dem aktuellen Benutzer als Verzeichnis und 1,2,3 darin.

Wenn ich es richtig verstanden habe und Sie einige Verzeichnisse und in diesen neue Verzeichnisse erstellen möchten, können Sie dies tun:

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

und erhalte sa1, sa2, ..., sa10 und in jedem Verzeichnis 1, 2 und 3.

Rinzwind
quelle
Ich stimme @ gniourf_gniourf zu. In Ihrer Antwort werden keine regulären Ausdrücke verwendet. Wollten Sie etwas anderes sagen oder ein anderes Beispiel geben?
Slipp D. Thompson
1
@ gniourf_gniourf fertig :)
Rinzwind
3
Es ist erwähnenswert, dass die Klammererweiterung in der POSIX-Shell nicht definiert ist: pubs.opengroup.org/onlinepubs/9699919799/utilities/… Zum Beispiel funktioniert es nicht, wenn dies unter Ubuntu dashdie Standardeinstellung ist /bin/sh.
Pabouk
7
Diese Antwort hängt davon ab, ob die Shell Ihre Eingabe erweitert, bevor Sie diese als Argumente für mkdir bereitstellen . Es ist viel genauer zu sagen, dass mkdir mehrere Verzeichnisse mit mehreren Argumenten erstellen kann und dann darüber spricht, wie eine bestimmte Shell dies einfacher machen kann.
deed02392
Wenn ich so etwas versuche, mkdir sa$(seq 0.1 0.1 1)muss nur ein Verzeichnis mit dem Namen sa0.1 und der Rest mit den Nummern 0.2, 0.3, ..., 1 erstellt werden. Wie kann ich die Dezimalklammer erweitern, ohne die gesamte Liste zu schreiben?
Sockel
26

Es ist sehr einfach, können Sie eine Verzeichnisstruktur erstellen, wie zum Beispiel:

Websites/
  static/
      cs
      js
  templates/
      html

Sie können dies mit einem einzigen Befehl tun:

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

Achten Sie darauf, keine Leerzeichen einzugeben

anas munir
quelle
Sie können hier auch die Tabulatortaste drücken, um sie zu erweitern, bevor Sie den Befehl ausführen.
Isaac Gregson
14

Erstellen Sie eine Liste der Namen für Ihre gewünschten Verzeichnisse, indem Sie Zeilenumbrüche anstelle von Kommas als Trennzeichen verwenden. Speichern Sie diese Liste.

mkdir `cat list`

Sie sollten jetzt alle benannten Verzeichnisse in Ihrer Liste haben.

SpaceCadet
quelle
1
Ja, das wird jedoch mit einer Einschränkung funktionieren - die Verzeichnisnamen müssen eine ganze Zeichenfolge sein. Wenn eine Zeile vorhanden ist spaced dir, werden zwei Verzeichnisse spacedund `dir erstellt.
Sergiy Kolodyazhnyy
Ja - Sie können nicht einmal erfolgreich für die Leerzeichen flüchten - junk\ dirin der listDatei gibt es zwei Verzeichnisse junk\ und dir. Hat mich in Panik versetzt, als ich einen \ in einem Verzeichnisnamen sah .
Jon V
Dies kann mit der -pin anderen Antworten erwähnten Flagge kombiniert werden . Wenn dies der listFall ist , muss die Datei keine übergeordneten Verzeichnisse als eigene Zeilen enthalten, sie werden erkannt und automatisch erstellt.
mcw0933
8

Etwas wie das? (danke an muru für den tipp printf)

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

Sie können es zur Vereinfachung der Verwendung in eine Funktion einbinden:

function mkdir_cs {
    printf '%s' "$1" | xargs -d, mkdir
}
$ ls
$ mkdir_cs 'foo,bar,baz'
$ ls
bar  baz  foo
$ 
kos
quelle
1
Nur ein printf "%s" "$1" | xargs -d, mkdirsollte genug sein.
muru
7

Sie möchten also eine durch Kommas getrennte Liste von Verzeichnisnamen? Das kann man machen.

Shell + Coreutils

Da alle Oneliner posten, ist hier auch meins (mkdir + Parametersubstitution plus + Shell-Umleitung).

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 ist eine Textverarbeitungssprache, hat jedoch eine sehr schöne system()Funktion, die die Standard-Shell aufruft und die in Klammern gesetzten Befehle ausführt (dies muss eine Zeichenfolge sein).

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

Oder Sie könnten ,mit gsub()function entfernen und aufrufen, system("mkdir "$0)aber das kann ein Problem sein, wenn Sie Verzeichnisse mit Leerzeichen im Namen erstellen möchten

Python

Eine pythonische Methode wäre, jede Zeile zu lesen, das Nachziehen zu \nbeenden, alles in eine Liste zu verschieben und die Listenelemente zu durchlaufen und Verzeichnisse pro Listenelement zu erstellen. Beachten Sie, dass im folgenden Beispiel /home/xieerqi/dirList.txtder vollständige Pfad zu meiner Datei angegeben ist. Der vollständige Pfad jedes neuen Verzeichnisses wird durch Verknüpfen der Zeichenfolge /home/username/und des aus der Liste gelesenen Verzeichnisnamens gebildet. Ersetzen Sie Ihre eigenen Werte nach Bedarf

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
quelle
3
Ich glaube nicht, dass der Fragesteller möchte, dass die Liste durch Kommas getrennt wird. Ich bin mir ziemlich sicher, dass das nur ihre Vermutung war, wie die Syntax aussehen könnte.
David Richerby
Nun, OP hatte wahrscheinlich keine durch Kommas getrennte Liste, aber es ist sicher, dass es als Methode verwendet werden kann, wobei der Punkt ist, dass "Listen auch verwendet werden können, Sie müssen den Namen jedes Verzeichnisses nicht einzeln eingeben". Dies ist insbesondere dann hilfreich, wenn mit Bereichen wie z dir{1..1000}. B. keine große Liste erstellt werden kann . Angenommen, Sie möchten ein Verzeichnis pro Benutzername oder pro Projekt oder pro geografischem Ort
erstellen
1

Der Befehl mkdir akzeptiert mehrere Argumente, die einfach wie folgt ausgeführt werden

mkdir dir1 dir2 dir3 ... dirN

Wenn Sie mehrere Unterverzeichnisse erstellen möchten, können Sie dieses Argument wie unten gezeigt in {} übergeben (verwenden Sie nur Kommas, um das Argument ohne Leerzeichen zu trennen).

mkdir dir1 dir2/{subdir1,subdir2,subdir3,subdirN} dir3 dirN
Vijay Sasvadiya
quelle