# mkdir — Verzeichnisse anlegen

> Praxis-Guide zu mkdir: einzelne Verzeichnisse, verschachtelte Bäume und Berechtigungen anlegen – inklusive Brace-Expansion und typischer Projektstrukturen.

Source: https://www.jpkc.com/db/cheatsheets/files-text/mkdir/

<!-- PROSE:intro -->
mkdir legt Verzeichnisse an – von einem einzelnen Ordner über verschachtelte Bäume bis zu kompletten Projektstrukturen in einem einzigen Aufruf. Der Schlüssel zur Produktivität ist die Option `-p`: Sie erstellt fehlende Elternverzeichnisse mit und meldet keinen Fehler, wenn das Verzeichnis schon existiert – ideal für Skripte. Mit `-m` setzt du die Berechtigungen direkt beim Anlegen, und mit Brace-Expansion baust du ganze Verzeichnis-Matrizen mit einem Befehl. Dieser Guide zeigt dir die Grundlagen, Berechtigungen, Brace-Muster und gängige Projekt-Layouts.
<!-- PROSE:intro:end -->

## Grundlagen

`mkdir <directory>` — Erstellt ein einzelnes Verzeichnis.

```bash
mkdir projects
```

`mkdir <dir1> <dir2> <dir3>` — Erstellt mehrere Verzeichnisse auf einmal.

```bash
mkdir css js images
```

`mkdir -v <directory>` — Ausführlicher Modus. Gibt für jedes erstellte Verzeichnis eine Meldung aus.

```bash
mkdir -v logs backups tmp
```

## Elternverzeichnisse

`mkdir -p <path/to/directory>` — Erstellt fehlende Elternverzeichnisse mit. Kein Fehler, wenn das Verzeichnis bereits existiert.

```bash
mkdir -p /var/www/html/assets/css
```

`mkdir -p <dir1>/sub1 <dir2>/sub2` — Erstellt mehrere verschachtelte Verzeichnisbäume auf einmal.

```bash
mkdir -p src/components src/utils src/hooks
```

`mkdir -pv <path/to/directory>` — Erstellt Elternverzeichnisse mit ausführlicher Ausgabe jedes angelegten Verzeichnisses.

```bash
mkdir -pv /opt/app/config/ssl
```

## Berechtigungen

`mkdir -m <mode> <directory>` — Erstellt ein Verzeichnis mit bestimmten Berechtigungen (oktaler Modus).

```bash
mkdir -m 755 /var/www/html
```

`mkdir -m 700 <directory>` — Erstellt ein privates Verzeichnis. Nur der Eigentümer hat Zugriff.

```bash
mkdir -m 700 ~/.ssh
```

`mkdir -m 1777 <directory>` — Erstellt ein Verzeichnis mit Sticky-Bit. Nutzer können nur ihre eigenen Dateien löschen.

```bash
mkdir -m 1777 /tmp/shared
```

`mkdir -m 2775 <directory>` — Erstellt ein Verzeichnis mit setgid. Neue Dateien erben die Gruppe des Verzeichnisses.

```bash
mkdir -m 2775 /var/www/shared
```

`mkdir -pm <mode> <path/to/directory>` — Erstellt verschachtelte Verzeichnisse mit bestimmten Berechtigungen auf dem letzten Verzeichnis.

```bash
mkdir -pm 700 ~/.config/app/secrets
```

## Brace-Expansion-Muster

`mkdir -p <base>/{<dir1>,<dir2>,<dir3>}` — Erstellt mehrere Unterverzeichnisse per Brace-Expansion.

```bash
mkdir -p project/{src,tests,docs}
```

`mkdir -p <base>/{<dir1>,<dir2>}/{<sub1>,<sub2>}` — Erstellt eine verschachtelte Verzeichnis-Matrix per verschachtelter Brace-Expansion.

```bash
mkdir -p app/{frontend,backend}/{src,tests,config}
```

`mkdir -p <base>/{01..12}` — Erstellt nummerierte Verzeichnisse per Sequenz-Expansion.

```bash
mkdir -p archive/2024/{01..12}
```

`mkdir -p <base>/{a..z}` — Erstellt alphabetisch benannte Verzeichnisse per Zeichenbereich.

```bash
mkdir -p index/{a..z}
```

`mkdir -p project/{src/{components,utils,hooks},public/{css,js,images},tests}` — Erstellt eine komplette Projekt-Verzeichnisstruktur in einem Befehl.

```bash
mkdir -p project/{src/{components,utils,hooks},public/{css,js,images},tests}
```

## Gängige Projektstrukturen

`mkdir -p <project>/{src,dist,tests,docs}` — Basis-Gerüst mit Quellcode, Build-Ausgabe, Tests und Doku.

```bash
mkdir -p my-app/{src,dist,tests,docs}
```

`mkdir -p <project>/{src/{css,js,images},dist,node_modules}` — Frontend-Projektstruktur mit Asset-Verzeichnissen.

```bash
mkdir -p website/{src/{css,js,images},dist,node_modules}
```

`mkdir -p <project>/{app/{Controllers,Models,Views},config,public,storage/{logs,cache}}` — Struktur einer MVC-Webanwendung.

```bash
mkdir -p my-app/{app/{Controllers,Models,Views},config,public,storage/{logs,cache}}
```

`mkdir -p <project>/{cmd,internal,pkg,api,configs,scripts,test}` — Standard-Layout eines Go-Projekts.

```bash
mkdir -p my-service/{cmd,internal,pkg,api,configs,scripts,test}
```

## Temporäre Verzeichnisse

`mktemp -d` — Erstellt ein temporäres Verzeichnis mit eindeutigem Namen in /tmp. Gibt den Pfad zurück.

```bash
TMPDIR=$(mktemp -d); echo $TMPDIR
```

`mktemp -d -t <template>` — Erstellt ein temporäres Verzeichnis mit eigenem Namens-Präfix.

```bash
mktemp -d -t myapp-XXXXXX
```

`mktemp -d -p <directory>` — Erstellt ein temporäres Verzeichnis innerhalb eines bestimmten Elternverzeichnisses.

```bash
mktemp -d -p /var/tmp
```

`mktemp -d && trap 'rm -rf "$TMPDIR"' EXIT` — Erstellt ein temporäres Verzeichnis, das beim Skriptende automatisch aufgeräumt wird.

```bash
TMPDIR=$(mktemp -d) && trap 'rm -rf "$TMPDIR"' EXIT
```

## Häufige Muster

`mkdir -p <dir> && cd <dir>` — Erstellt ein Verzeichnis und wechselt sofort hinein.

```bash
mkdir -p ~/projects/new-app && cd ~/projects/new-app
```

`[ -d <dir> ] || mkdir -p <dir>` — Erstellt ein Verzeichnis nur, wenn es nicht existiert (explizite Prüfung).

```bash
[ -d /var/log/app ] || mkdir -p /var/log/app
```

`install -d -m <mode> -o <owner> -g <group> <directory>` — Erstellt ein Verzeichnis mit Berechtigungen, Eigentümer und Gruppe in einem Befehl.

```bash
install -d -m 755 -o www-data -g www-data /var/www/html
```

`mkdir -p <dir> && cp <files> <dir>/` — Erstellt das Zielverzeichnis und kopiert Dateien hinein.

```bash
mkdir -p /backup/2024 && cp *.sql /backup/2024/
```

`for d in <list>; do mkdir -p "$d"; done` — Erstellt Verzeichnisse aus einer dynamischen Liste oder Variablen.

```bash
for d in dev staging prod; do mkdir -p "/deploy/$d/releases"; done
```

<!-- PROSE:outro -->
## Fazit

mkdir ist eines der grundlegendsten Kommandos überhaupt, gewinnt aber durch zwei Optionen enorm an Komfort: `-p` legt fehlende Elternverzeichnisse an und bleibt still, wenn das Verzeichnis schon existiert (perfekt für idempotente Skripte), und `-m` setzt die Berechtigungen direkt beim Anlegen, sodass keine sensible Race-Condition zwischen mkdir und einem nachfolgenden chmod entsteht. In Kombination mit Brace-Expansion baust du komplette Projektgerüste mit einem einzigen Befehl. Für Wegwerf-Arbeitsverzeichnisse greif zu `mktemp -d` statt zu vorhersagbaren Namen in /tmp.

## Weiterführende Links

- [ubuntuusers-Wiki: mkdir](https://wiki.ubuntuusers.de/mkdir/) – deutschsprachige Erklärung mit Beispielen
- [GNU coreutils: mkdir invocation](https://www.gnu.org/software/coreutils/manual/html_node/mkdir-invocation.html) – offizielle Referenz aller Optionen (englisch)
<!-- PROSE:outro:end -->

## Verwandte Kommandos

- [touch](https://www.jpkc.com/db/cheatsheets/files-text/touch/) – leere Dateien anlegen und Zeitstempel setzen
- [rm](https://www.jpkc.com/db/cheatsheets/files-text/rm/) – Dateien und Verzeichnisse löschen
- [ls](https://www.jpkc.com/db/cheatsheets/files-text/ls/) – Verzeichnisinhalte anzeigen

