Automatisierte Methode zum Erstellen eines Verzeichnisbaums

11

Ich versuche, einen Verzeichnisbaum von A bis Z zu erstellen, in dem sich das nächste Verzeichnis im aktuellen Verzeichnis befindet.

Zum Beispiel: B ist innerhalb von A und C ist innerhalb von B und so weiter.

-A
--B
---C
----...Z

Irgendwelche Hinweise, wie man es automatisiert macht?

Nish
quelle
Ich frage mich, was der praktische Zweck solcher Verzeichnisse ist. IMHO sieht das eher nach einer Frage für Code Golf aus .
Melebius
3
@Melebius Ein möglicher Zweck besteht darin, eine Verzeichnisstruktur als Testfall zu erstellen, um zu überprüfen, ob ein anderer Befehl, ein anderes Skript oder eine andere Anwendung funktioniert. Hier ist ein aktueller Fall, in dem es bei der Frage selbst nicht darum ging, bestimmte Verzeichnisstrukturen zu erstellen, sondern zu Testzwecken zu wissen, wie Befehle dazu geschrieben werden, nicht trotz der Art und Weise, wie die bestimmte Struktur erfunden und seltsam war, sondern aufgrund dessen. (Wir haben auch viele Fragen zum Erstellen spezifischer Verzeichnisstrukturen, die durch Suchen nach " mkdir -p" gefunden werden können.)
Eliah Kagan

Antworten:

25

Mit mkdir, printfund bash Klammer Expansion:

$ mkdir -p "$(printf "%s/" {A..Z})"
$ tree A
A
└── B
    └── C
        └── D
            └── E
                └── F
                    └── G
                        └── H
                            └── I
                                └── J
                                    └── K
                                        └── L
                                            └── M
                                                └── N
                                                    └── O
                                                        └── P
                                                            └── Q
                                                                └── R
                                                                    └── S
                                                                        └── T
                                                                            └── U
                                                                                └── V
                                                                                    └── W
                                                                                        └── X
                                                                                            └── Y
                                                                                                └── Z

25 directories, 0 files
  • {A..Z}erweitert sich zu A B ... Z,
  • printf "%s/"druckt die Argumente mit einem /nach ihnen aus, damit ich bekommeA/B/...Z/
  • und mkdir -perstellt das A/B/.../ZVerzeichnis mit allen übergeordneten Verzeichnissen, die erstellt werden müssen.
muru
quelle
Dank dafür. Ich dachte, ich bekomme diesen Fehler während. Ich benutze den Befehl mkdir: A / B / C / D / E / F / G / H / I / J / K / L / M / N / O / P / Q / R / S / T / U / V / W / X / Y: Keine solche Datei oder Verzeichnis
Nish
3
@Nish Da ist ein -pim mkdirBefehl.
Muru
Mein schlechtes, ich habe das auf meinem Mac statt Ubuntu versucht. Und eine Folgefrage lautet:> Nehmen wir an, ich wollte das Verzeichnis A1..A100 in A haben (in derselben Struktur AtoZ). Dann B1..B100 innerhalb von B. So sieht es ungefähr so ​​aus -> imgur.com/jfuKEdf
Nish
11
Angenommen, Sie veröffentlichen ein Follow-up als eigentliche Frage anstatt in den Kommentaren und verwenden keine Bilder, sondern Text. Das wäre viel besser, nein?
Muru
Ich verstehe Ihren Standpunkt hier. Es ist schwierig, es zu posten, da es kein Code ist und es eine riesige Ausgabe ist. Ein einfacher Blick auf den Screenshot erleichtert das Verständnis.
Nish
7

Auf der sehr einfachen Ebene können Sie die {A..Z}Erweiterung verwenden, um den gesamten Buchstaben zu generieren, und dann iterativ jeden einzelnen erstellen und eingeben:

~/test_directory$ for d in {A..Z}; do mkdir "$d"; cd "$d"; done
~/test_directory/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z$ 

Wie Sie in meiner Eingabeaufforderung sehen können, haben Sie jetzt das Verzeichnis vollständig verkettet.

Wenn sich die tatsächlichen Verzeichnisnamen jedoch von nur dem Alphabet unterscheiden, müssen Sie die Liste der Verzeichnisnamen irgendwie bereitstellen, möglicherweise über eine Datei, über die Sie iterieren und denselben Vorgang erneut ausführen. Grundsätzlich ist dies

while IFS= read -r dir_name;do mkdir "$dir_name"; cd "$dir_name" ;done < directory_list.txt
Sergiy Kolodyazhnyy
quelle
Das ist ziemlich toll. Hier ist eine Folgefrage. Nehmen wir an, ich wollte das Verzeichnis A1..A100 in A haben (in derselben Struktur wie AtoZ). Dann B1..B100 innerhalb von B. So sieht es ungefähr so ​​aus -> imgur.com/jfuKEdf
Nish
@ Nish ah, das würde eine innere Schleife erfordern, alsofor d in {A..Z}; do mkdir "$d"; cd "$d"; for i in {1..100}; do mkdir "${d}${i}" ;done ; done
Sergiy Kolodyazhnyy
Oder sogar ohne innere Schleife,for d in {A..Z}; do mkdir "$d"; cd "$d"; mkdir "$d"{1..100}; done
Sergiy Kolodyazhnyy
Dank dafür. Es scheint zu funktionieren, aber die Reihenfolge des Verzeichnisses scheint durcheinander zu sein, so dass 2 nicht nach 1 steht. Es ist zufällig sortiert. Wie auch immer, um das zu beheben? Hier ist ein Screenshot -> imgur.com/a/Zqj1c
Nish
@Nish Die Sortierreihenfolge ist textbasiert und nicht numerisch, wie Sie es erwarten. Soweit treebin ich nicht sicher , wie das zu beheben, aber ich denke , das könnte nicht einmal sein tree‚s Problem, sondern Shell Sortierung. Ich würde vorschlagen, hier oder besser noch auf unix.stackexchange.com
Sergiy Kolodyazhnyy
2

Auch wenn Murus printfWeg nicht zu übertreffen ist, mag ich persönlich so jotetwas. jotist in Ubuntu nicht standardmäßig installiert. Das athena-jotPaket bietet es. Jeder dieser Befehle funktioniert:

mkdir -p "$(jot -s/ -c 26 A)"
jot -s/ -c 26 A | xargs mkdir -p

Wirklich jeder Befehl, der die Folge von Buchstaben erzeugt und sie mit Schrägstrichen verbindet, erleichtert dies, da seine Ausgabe dann mkdir -pentweder durch Befehlssubstitution (wie in Murus Antwort ) oder durch Verwendung an übergeben werden kann xargs. Hier sind einige Beispiele mit einigen Tools xargs, für die Sie keine Software installieren müssen, außer vielleicht auf sehr minimalen Systemen oder Ubuntu Core:

perl -we 'print join "/", A..Z' | xargs mkdir -p
ruby -we 'print (?A..?Z).to_a * ?/' | xargs mkdir -p
python3 -c 'print("/".join(__import__("string").ascii_uppercase))' | xargs mkdir -p

Alte Ubuntu-Versionen werden mit Python 2 anstelle von Python 3 geliefert. Wechseln Sie python3dazu einfach zu python, damit der letzte Befehl funktioniert, wenn Sie dies wirklich mit Python tun möchten.

Ebenso kann alternativ Murus kurzer und einfacher Weg geschrieben werden:

printf '%s/' {A..Z} | xargs mkdir -p

Das Trailing /im Verzeichnispfad mkdir -p, das erstellt werden soll, ist kein Problem und ist stilistisch wohl vorzuziehen. Aber es ist in Ordnung, es wegzulassen, wie es die anderen Beispiele in dieser Antwort tun.

Eliah Kagan
quelle