Anleitung: Dateien mit mehreren Erweiterungen in Bash auswählen
August 12, 2017
In der Kommandozeile ist es oft notwendig, Operationen auf einer Gruppe von Dateien auszuführen, die unterschiedliche, aber verwandte Dateiendungen haben (z.B. .jpg, .jpeg, .png). Bash bietet hierfür verschiedene Mechanismen, von einfacher Shell-Expansion bis hin zum mächtigen find-Befehl.
Methode 1: Brace Expansion (Geschweifte Klammern)
Brace Expansion ({...}) ist ein Mechanismus in Bash, um beliebige Strings zu generieren. Er ist ideal für einfache Suchen im aktuellen Verzeichnis.
# Listet alle .md-, .json- und .html-Dateien im aktuellen Verzeichnis auf
ls -l *.{md,json,html}
*.{md,json,html}wird von der Shell zu*.md *.json *.htmlexpandiert, bevor derls-Befehl ausgeführt wird.- Es dürfen keine Leerzeichen innerhalb der geschweiften Klammern sein.
Anwendungsbeispiel: Alle Bilddateien verschieben
# Verschiebt alle Bilder in einen Unterordner
mv *.{jpg,jpeg,png,gif} ./bilder/
Methode 2: find-Befehl (Rekursiv und Mächtig)
Für die rekursive Suche in Unterverzeichnissen oder für komplexere Filterkriterien ist der find-Befehl die robusteste Lösung. Der -o-Operator fungiert dabei als logisches "ODER".
Dateien mit mehreren Erweiterungen finden
# Sucht ab dem aktuellen Verzeichnis (.) nach regulären Dateien (-type f),
# deren Name entweder auf .html, .xml oder .php endet.
find . -type f \( -name "*.html" -o -name "*.xml" -o -name "*.php" \)
\(und\): Die Klammern gruppieren die-o-Bedingungen. Sie müssen mit einem Backslash escaped werden, damit sie nicht von der Shell interpretiert werden.-o: Der ODER-Operator.
Aktionen auf gefundene Dateien anwenden
Sie können die gefundenen Dateien direkt an einen anderen Befehl übergeben.
Beispiel: Alle gefundenen Dateien löschen
Warnung: Überprüfen Sie das Ergebnis immer zuerst, bevor Sie -delete verwenden.
- Trockenlauf (Dry Run):
code
find . -type f \( -name "*.tmp" -o -name "*.bak" \) -print - Löschen:
code
find . -type f \( -name "*.tmp" -o -name "*.bak" \) -delete
Beispiel: Berechtigungen für alle Skript-Dateien setzen
find . -type f \( -name "*.sh" -o -name "*.py" \) -exec chmod +x {} \;
Fazit
- Für schnelle Operationen im aktuellen Verzeichnis ist die Brace Expansion (
*.{ext1,ext2}) die einfachste und lesbarste Methode. - Für rekursive Suchen oder wenn die Dateiliste als Eingabe für andere Befehle dienen soll, ist der
find-Befehl mit-odie mächtigere und flexiblere Lösung.