„Warum tippt der Kollege einen Befehl und erstellt damit fünf Ordner gleichzeitig?“ Wer diese Frage schon mal hatte, ist hier genau richtig. Der Befehl mkdir -p data/{db,app} nutzt ein mächtiges Bash-Feature namens Brace Expansion – und nach diesem Artikel werdet ihr es täglich einsetzen. Nach über 15 Jahren Erfahrung in Softwarequalität, Open Source und Remote Consulting zeigen wir euch, wie ihr mit geschweiften Klammern euren Terminal-Workflow massiv beschleunigt.
Warum jeder Developer Brace Expansion kennen sollte
Jeder Tastendruck zählt. Wer täglich im Terminal arbeitet, weiß: Repetitive Befehle kosten Zeit und Nerven. Statt mkdir data && mkdir data/db && mkdir data/app tippt ihr einfach mkdir -p data/{db,app} – ein Befehl, drei Ordner. Das ist keine Magie, sondern Brace Expansion.
Das Team von Never Code Alone setzt dieses Feature in jedem Projekt ein – vom schnellen Prototyping bis zur komplexen CI/CD-Pipeline. Der Produktivitätsgewinn ist enorm, sobald ihr die Syntax verinnerlicht habt.
Was ist Bash Brace Expansion und wie funktioniert sie?
Brace Expansion ist ein Mechanismus der Bash-Shell, der aus einem Pattern mit geschweiften Klammern mehrere Strings generiert. Die Shell ersetzt {a,b,c} durch a b c, bevor der eigentliche Befehl ausgeführt wird. Das passiert noch vor allen anderen Expansionen wie Variablen oder Wildcards.
Der Befehl aus unserem Beispiel:
mkdir -p data/{db,app}
Wird von der Shell zu diesem Befehl expandiert:
mkdir -p data/db data/app
Die geschweiften Klammern verschwinden, und mkdir erhält zwei separate Argumente. Das -p Flag sorgt dafür, dass auch der übergeordnete data-Ordner erstellt wird, falls er noch nicht existiert.
Ihr könnt die Expansion selbst testen, ohne etwas zu verändern:
echo data/{db,app}
# Ausgabe: data/db data/app
Wie erstelle ich mehrere Ordner mit einem einzigen mkdir-Befehl?
Die Kombination aus mkdir -p und Brace Expansion ist der Klassiker für Projektstrukturen. Statt jeden Ordner einzeln anzulegen, definiert ihr die gesamte Struktur in einem Befehl.
Einfache Ordnerliste:
mkdir -p projekt/{src,tests,docs,config}
Das erstellt vier Ordner unter projekt/. Mit verschachtelten Klammern geht noch mehr:
mkdir -p projekt/{src/{components,utils,services},tests/{unit,integration},docs}
Ergebnis:
- projekt/src/components
- projekt/src/utils
- projekt/src/services
- projekt/tests/unit
- projekt/tests/integration
- projekt/docs
Praxis-Tipp aus dem Consulting: Speichert eure Standard-Projektstrukturen als Shell-Alias. So habt ihr mit einem Wort die komplette Ordnerstruktur.
Was bedeutet die -p Option bei mkdir genau?
Das -p Flag steht für „parents“ und hat zwei wichtige Funktionen. Erstens: Es erstellt alle übergeordneten Verzeichnisse automatisch, wenn sie noch nicht existieren. Zweitens: Es gibt keinen Fehler aus, wenn ein Verzeichnis bereits vorhanden ist.
Ohne -p:
mkdir data/db/logs
# Fehler: mkdir: data/db: No such file or directory
Mit -p:
mkdir -p data/db/logs
# Erstellt data/, data/db/ und data/db/logs/ in einem Rutsch
Das macht mkdir -p idempotent – ihr könnt den Befehl beliebig oft ausführen, ohne Fehler zu produzieren. Ideal für Setup-Skripte und Automatisierung.
Kann man Brace Expansion auch für Zahlenreihen verwenden?
Absolut. Neben kommaseparierten Listen unterstützt Brace Expansion auch Ranges mit zwei Punkten. Das ist perfekt für nummerierte Dateien oder Ordner.
Zahlenbereich:
mkdir backup-{1..5}
# Erstellt: backup-1, backup-2, backup-3, backup-4, backup-5
Buchstabenbereich:
touch file-{a..e}.txt
# Erstellt: file-a.txt, file-b.txt, file-c.txt, file-d.txt, file-e.txt
Mit Schrittweite (ab Bash 4.0):
echo {0..20..5}
# Ausgabe: 0 5 10 15 20
Zero-Padding für sortierte Dateinamen:
touch log-{01..12}.txt
# Erstellt: log-01.txt bis log-12.txt (mit führender Null)
Consulting-Erfahrung: Nummerierte Logs oder Backup-Verzeichnisse sind ein häufiger Anwendungsfall. Mit Brace Expansion spart ihr euch Schleifen in euren Skripten.
Was ist der Unterschied zwischen Brace Expansion und Wildcards?
Diese Frage kommt oft – und die Unterscheidung ist wichtig. Wildcards wie * und ? sind Globbing-Pattern, die auf existierende Dateien matchen. Brace Expansion generiert Strings unabhängig davon, ob entsprechende Dateien existieren.
Wildcards (Globbing):
ls *.txt
# Listet alle existierenden .txt-Dateien
Brace Expansion:
echo {readme,changelog,license}.md
# Gibt "readme.md changelog.md license.md" aus – egal ob die Dateien existieren
Ein praktisches Beispiel: Ihr wollt Dateien umbenennen, die noch nicht existieren:
# Wildcards funktionieren hier NICHT
touch report-{2024,2025}-{q1,q2,q3,q4}.pdf
# Erstellt 8 Dateien für alle Quartale beider Jahre
Wichtiger Hinweis: Brace Expansion wird vor Globbing ausgeführt. Das bedeutet, ihr könnt beide kombinieren – aber die Reihenfolge der Verarbeitung müsst ihr verstehen.
Wie kombiniere ich Präfix und Suffix mit Brace Expansion?
Das ist einer der praktischsten Aspekte. Text vor der Klammer heißt Preamble (Präfix), Text danach Postscript (Suffix). Beide werden mit jedem Element der Expansion kombiniert.
Präfix:
echo /var/log/{syslog,auth,kern}
# Ausgabe: /var/log/syslog /var/log/auth /var/log/kern
Suffix:
echo {config,database,cache}.json
# Ausgabe: config.json database.json cache.json
Beides kombiniert:
touch /tmp/backup-{db,files,config}-$(date +%Y%m%d).tar.gz
# Erstellt drei Backup-Dateien mit Datumsstempel
Verschachtelt für komplexe Strukturen:
mkdir -p app/{frontend/{css,js,img},backend/{controllers,models,views}}
Das generiert eine komplette MVC-Struktur mit einem Befehl.
Welche Shells unterstützen Brace Expansion?
Brace Expansion ist kein POSIX-Standard, funktioniert aber in den meisten modernen Shells. Hier der Überblick:
Volle Unterstützung:
- Bash (ab Version 3.0, Ranges ab 4.0)
- Zsh
- Ksh93
Keine Unterstützung:
- Dash (Standard-Shell auf vielen Debian/Ubuntu-Systemen für Skripte)
- Bourne Shell (sh)
- POSIX sh
Das ist besonders wichtig für Skripte. Wenn euer Skript mit #!/bin/sh beginnt, funktioniert Brace Expansion möglicherweise nicht. Verwendet stattdessen:
#!/bin/bash
Oder prüft explizit:
# Im Skript testen
echo {a,b}c
# Wenn Ausgabe "ac bc" → Brace Expansion aktiv
# Wenn Ausgabe "{a,b}c" → nicht unterstützt
Welche häufigen Fehler passieren bei Brace Expansion?
Der häufigste Fehler: Leerzeichen. Brace Expansion funktioniert nur ohne Leerzeichen innerhalb der Klammern.
Falsch:
echo {a, b, c}
# Ausgabe: {a, b, c} – keine Expansion!
Richtig:
echo {a,b,c}
# Ausgabe: a b c
Weitere Stolperfallen:
Einzelnes Element ist keine Expansion:
echo {single}
# Ausgabe: {single} – mindestens ein Komma oder Range nötig
Variablen in Klammern funktionieren nicht direkt:
items="a,b,c"
echo {$items}
# Ausgabe: {a,b,c} – Variable wird erst nach Brace Expansion ersetzt
Lösung für dynamische Listen: eval oder Arrays verwenden.
Anführungszeichen verhindern Expansion:
echo "{a,b,c}"
# Ausgabe: {a,b,c} – Quotes schützen vor Expansion
Wie nutze ich Brace Expansion in Shell-Skripten effektiv?
In Skripten entfaltet Brace Expansion ihr volles Potenzial. Hier einige bewährte Patterns aus unserer Consulting-Praxis:
Projekt-Setup-Skript:
#!/bin/bash
PROJECT_NAME=$1
mkdir -p "$PROJECT_NAME"/{src,tests,docs,scripts}
mkdir -p "$PROJECT_NAME"/src/{components,utils,services,types}
mkdir -p "$PROJECT_NAME"/tests/{unit,integration,e2e}
touch "$PROJECT_NAME"/{README.md,LICENSE,.gitignore,.env.example}
echo "Projekt $PROJECT_NAME erstellt!"
Backup mit Rotation:
#!/bin/bash
# Alte Backups löschen, neue erstellen
rm -f /backup/daily-{8..30}.tar.gz 2>/dev/null
for i in {7..1}; do
mv /backup/daily-$i.tar.gz /backup/daily-$((i+1)).tar.gz 2>/dev/null
done
tar -czf /backup/daily-1.tar.gz /data
Mehrere Dateien gleichzeitig bearbeiten:
# Alle Config-Dateien mit vim öffnen
vim {nginx,apache,php}.conf
# Mehrere Logs gleichzeitig anzeigen
tail -f /var/log/{syslog,auth.log,nginx/error.log}
Praktische Anwendungsfälle für den Entwickler-Alltag
Hier sind die Use Cases, die wir täglich sehen:
Docker-Compose-Struktur:
mkdir -p docker/{nginx,php,mysql}/{conf,logs,data}
Git-Branches vergleichen:
git diff {main,feature/new-api}
# Equivalent zu: git diff main feature/new-api
Schnelles Umbenennen:
mv config.{json,json.bak}
# Equivalent zu: mv config.json config.json.bak
Dateien kopieren mit neuem Namen:
cp important-file.txt{,.backup}
# Equivalent zu: cp important-file.txt important-file.txt.backup
Mehrere Packages installieren:
apt install php-{mysql,curl,gd,mbstring,xml}
Best Practices aus über 15 Jahren Consulting-Erfahrung
Bei Never Code Alone haben wir folgende Standards für Brace Expansion etabliert:
Lesbarkeit vor Kürze: Verschachtelte Expansions können unleserlich werden. Splittet komplexe Strukturen lieber auf mehrere Zeilen.
Echo zum Testen: Bevor ihr destruktive Befehle wie rm mit Brace Expansion ausführt, testet mit echo:
echo rm -rf /tmp/test-{1..5}
# Zeigt was gelöscht würde, ohne es zu tun
Dokumentation in Skripten: Kommentiert komplexe Expansions, damit auch Kollegen sie verstehen:
# Erstellt Monatsordner für Q1-Q4 mit Unterordnern
mkdir -p reports/{q{1..4}}/{jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec}
Portabilität beachten: Wenn Skripte auf verschiedenen Systemen laufen sollen, prüft die Shell-Kompatibilität oder verwendet explizit Bash.
Direkte Unterstützung für euer Team
Ihr wollt eure Terminal-Workflows optimieren oder sucht Unterstützung bei der Automatisierung eurer Development-Prozesse? Mit über 15 Jahren Expertise in Softwarequalität und Remote Consulting helfen wir euch gerne weiter.
Kontakt: roland@nevercodealone.de
Gemeinsam analysieren wir eure Workflows, identifizieren Automatisierungspotenzial und entwickeln Skripte, die euch täglich Zeit sparen – keine theoretischen Vorträge, sondern praktische Pair-Programming-Sessions, die sofort Ergebnisse liefern.
Fazit: Kleine Syntax, große Wirkung
Brace Expansion ist eines dieser Features, das man einmal lernt und dann täglich nutzt. Der Befehl mkdir -p data/{db,app} ist erst der Anfang – mit Ranges, Verschachtelungen und Kombinationen aus Präfix und Suffix könnt ihr komplexe Dateioperationen in einen einzigen, lesbaren Befehl packen.
Startet heute: Öffnet euer Terminal und experimentiert mit echo {a,b,c}. Sobald ihr seht, wie die Shell die Klammern expandiert, werdet ihr überall Anwendungsfälle entdecken.
Never Code Alone – Gemeinsam für bessere Software-Qualität!
