Ich möchte viele Verzeichnisse mit erstellen mkdir
. Jeder Verzeichnisname besteht aus einem Präfix (einer Zeichenfolge) und einem Index (einer Ganzzahl). Angenommen, ich möchte, dass das Präfix "s" ist und die Indizes im Bereich von 1 bis 50 liegen. Dies bedeutet, dass ich Verzeichnisse mit dem Titel erstellen möchte:
s1
,, s2
... s49
,,s50
Gibt es eine Möglichkeit, dies automatisch mit zu tun mkdir
? Vielen Dank für Ihre Zeit.
bash
. Vielen Dank für Ihre Zeit!s01
,s02
, ...,s49
,s50
. Wenn ich Indizes mit fester Breite verwendet habe, wird/bin/ls
fast immer die gewünschte Reihenfolge erstellt.Antworten:
Sie können dies mit einem Shell-Skript tun.
Pure sh - das funktioniert auch auf Pre-POSIX-Bourne-Shells:
Wenn Sie eine große Anzahl von Verzeichnissen erstellen möchten, können Sie das Skript beschleunigen, indem Sie es auf einen einzigen Aufruf von reduzieren und
mkdir
Shell-Builtins für Tests und Berechnungen verwenden. So was:Zsh, ksh93 oder bash machen dies viel einfacher, aber ich sollte darauf hinweisen, dass dies nicht eingebaut ist
mkdir
und möglicherweise nicht in anderen Shells funktioniert. In größeren Fällen kann die Anzahl oder Gesamtgröße der Argumente, die an einen Befehl übergeben werden können, begrenzt sein.quelle
n=$(( n + 1 ))
genauso streng POSIX gewesen und hätte dich keine Subshell gekostet.[[
Schlüsselwort ist nicht POSIX. (Ganz zu schweigen davon, dass[
ist eine Shell - builtin in vielen modernen Muscheln.)[[
auf meinemksh88
(was älter istbash
), also habe ich angenommen, dass es POSIX ist. Ich konnte keine Erwähnung in der POSIX-Spezifikation finden, also glaube ich, dass Sie Recht haben. Danke für die Information!for i in {range}
für Benutzer fortgeschrittener Shells ein Platz vorhanden ist.Eins
Zwei
Diese Option funktioniert in bash , zsh und ksh93
Drei
quelle
$i
als nur ein Verzeichnis erstellen, zmkdir s$i ; echo $i > s$i/$i
. Außerdem ist One ein schönes, einfaches Beispiel für die Verwendung einer for-Schleife in bash ... auf einer Site wie dieser ist es keineswegs unwahrscheinlich, dass ein Anfänger sie sieht und denkt: "Nett, ich habe nicht bemerkt, dass Sie das können "---> Erleuchtung.Viele komplizierte Antworten hier, aber Bash macht es wirklich einfach. Sicher, die reine POSIX-Lösung funktioniert, aber warum nicht trotzdem die von
bash
Ihnen verwendete Shell nutzen? Sie können dies leicht mit Klammer Expansion :quelle
mkdir $(seq --format 's%.0f' 1 50)
oder wenn Sie mit Nullen aufgefüllte Zahlen haben möchten (was für die Sortierung besser wäre):
mkdir $(seq --format 's%02.0f' 1 50)
oder:
mkdir s$(seq -s ' s' -w 1 50)
- beachte den String 's' kurz vor dem$()
, ohne diesen wird als erstes Verzeichnis nur '01' anstatt 's01' angelegtund schlussendlich:
mkdir $(printf "s%02i " $(seq 1 50))
seq
ist von GNU Coreutilsseltsamerweise erlaubt seqs
--format
oder-f
option nur die Gleitkomma-Doppeltypen von printf (wie f und g. auch ein seltsames Fließkomma-Hex-Format, für das ich nie eine Verwendung gefunden habe). Ich habe keine Idee warum. Es wäre schön, wenn es auch andereprintf(3)
numerische Typen wie Integer (d, i), Octal (o, U) oder Hex (x, X) unterstützen würde.Wie auch immer, ein Doppelformat mit einer Dezimalgenauigkeit von 0 entspricht einer Ganzzahl
%.0f
oder%02.0f
liegt nahe genug für diesen Zweck.Siehe auch: http://www.gnu.org/software/coreutils/manual/html_node/seq-invocation.html
quelle
{1,50}
oder{01,50}
(zum Null-Auffüllen) ist viel einfacher und verständlicher.Nur um anders zu sein, hier ist eine POSIX-sh-Lösung, die Rekursion verwendet:
quelle