Wie erstelle ich mehrere Verzeichnisse gleichzeitig in einem Verzeichnis?

25

Ich weiß, dass ich mit mkdir mkdir A B C D E Fjedes Verzeichnis erstellen kann . Wie erstelle ich Verzeichnisse von AZ oder 1-100, ohne jeden Buchstaben oder jede Zahl einzugeben?

Steve Burdine
quelle

Antworten:

18

Am einfachsten ist es wahrscheinlich, eine forSchleife zu verwenden:

for char in {A..Z}; do
    mkdir $char
done

for num in {1..100}; do
    mkdir $num
done

Sie benötigen jedoch mindestens Bash 3.0. ansonsten musst du sowas benutzenseq

Michael Mrozek
quelle
1
Michael, danke! da ich neugierig bin, habe ich es auch versucht und test vor $ char für char in {A..Z} hinzugefügt; Mkdir Test $ char getan, die gab mir Verzeichnisse Test [AZ], immer gut zu lernen
Steve Burdine
Beachten Sie, wie Ihre Dateinamen sortiert werden, wenn Sie sie auflisten oder mit Platzhaltern wie * verwenden. '11' wird vor '2' sortiert. Dies kann vermieden werden, wenn Sie dafür sorgen, dass alle Zahlen mit führenden Nullen gleich lang sind. Dennis Williams zeigt, wie man das in Bash 4 macht, aber Sie können Ihr Skript dafür codieren, wenn Sie Bash 4 nicht haben.
Joe
71

Die {}Syntax ist die Bash-Syntax, die nicht an das forKonstrukt gebunden ist .

mkdir {A..Z}

ist für sich allein ausreichend.

http://www.gnu.org/software/bash/manual/bashref.html#Brace-Expansion

rcrowley
quelle
5
Oh, das ist spektakulär. Dies ist eine viel bessere Antwort
Michael Mrozek
1
Ich wusste das nicht, toller Tipp!
Invertzucker
5
+1 für Schönheit, +1 für Stil, +1 für rcrowley
Stefan
+500 Kopfgeld von mir.
George Chalhoub
Das ist fantastisch! mkdir -p ./logs-{1..5}
Ich
8

Sie können auch komplexere Kombinationen erstellen (probieren Sie diese echoaus, mkdirdamit anschließend keine Bereinigung erfolgt):

Vergleichen Sie

$ echo pre-{{F..G},{3..4},{m..n}}-post
pre-F-post pre-G-post pre-3-post pre-4-post pre-m-post pre-n-post

zu

$ echo pre-{F..G}{3..4}{m..n}-post
pre-F3m-post pre-F3n-post pre-F4m-post pre-F4n-post pre-G3m-post pre-G3n-post
pre-G4m-post pre-G4n-post

Wenn Sie Bash 4 haben, versuchen Sie es

$ echo file{0001..10}
file0001 file0002 file0003 file0004 file0005 file0006 file0007 file0008 file0009
file0010

und

$ echo file{0001..10..2}
file0001 file0003 file0005 file0007 file0009
Bis auf weiteres angehalten.
quelle
7

Unter Linux können Sie mit dem Befehl "seq" Ziffernfolgen erzeugen, die jedoch nicht auf allen Unix-Systemen vorhanden sind. So generieren Sie beispielsweise Verzeichnisse von 1 bis 100:

mkdir `seq 1 100`

Mit Shell-Utils können Sie zwar durchaus Verzeichnisse von A bis Z erstellen:

seq 65 90 \
    | while read foo; do printf "%b\n" `printf '\\\\x%x\n' $foo`; done \
    | xargs mkdir

Es ist wahrscheinlich viel weniger hässlich, nur Perl zu verwenden:

perl -e 'foreach (ord "A"..ord "Z") { mkdir chr $_ }'
dhd
quelle
-1

mkdir direct{1..3}führt zu mkdir direct1 direct2 direct3und so weiter. Gleiches gilt für{a..z}

Lionel AVOGNON
quelle
2
Dies ist eine Wiederholung von drei bestehenden Antworten und der, die ich bereits kommentiert habe
Jeff Schaller
-2

mkdir {A..Z} mkdir {0..100} mkdir test_ {A..Z} und so weiter.

Avognon Lionel
quelle
Ich verstehe es nicht
Pierre.Vriens
1
Dies wurde bereits behandelt
Jeff Schaller