Dateien in `snake_case` umbenennen mit Bash
March 21, 2019
In der Kommandozeile und in Skripten können Dateinamen, die Leerzeichen oder Großbuchstaben enthalten, umständlich zu handhaben sein. Das snake_case-Format (alles in Kleinbuchstaben, Wörter durch Unterstriche getrennt) ist eine bewährte Konvention, um Dateinamen einfach und konsistent zu halten.
Diese Anleitung zeigt zwei Methoden, um Dateien stapelweise in snake_case umzubenennen.
Wichtiger Sicherheitshinweis: Testen Sie Umbenennungs-Befehle immer zuerst in einem Testverzeichnis oder verwenden Sie "Dry Run"-Optionen, um unbeabsichtigte Änderungen zu vermeiden.
Methode 1: Verwendung des rename-Befehls (Perl-Version)
Viele Linux-Distributionen (wie Debian und Ubuntu) liefern eine rename-Version, die Perl-reguläre Ausdrücke verwendet. Dies ist oft der schnellste Weg für komplexe Umbenennungen.
-
Installation (falls erforderlich):
codesudo apt update sudo apt install rename -
Umbenennung in zwei Schritten: Zuerst werden Leerzeichen durch Unterstriche ersetzt, dann wird alles in Kleinbuchstaben umgewandelt.
code# Schritt 1: Leerzeichen ersetzen (Trockenlauf mit -n) rename -n 's/ /_/g' * # Schritt 2: In Kleinbuchstaben umwandeln (Trockenlauf mit -n) rename -n 'y/A-Z/a-z/' *-noder--nono: Führt einen Trockenlauf durch und zeigt nur an, welche Umbenennungen vorgenommen würden.s/ /_/g: Ersetzt global (g) alle Leerzeichen durch Unterstriche.y/A-Z/a-z/: Übersetzt (y) alle Großbuchstaben in Kleinbuchstaben.
Wenn die Ausgabe des Trockenlaufs korrekt ist, entfernen Sie das
-n-Flag, um die Umbenennungen tatsächlich durchzuführen.
Methode 2: Reine Bash-Lösung mit einer for-Schleife
Diese Methode ist portabler, da sie keine externe rename-Implementierung benötigt und auf den meisten Systemen (einschließlich macOS) ohne zusätzliche Installation funktioniert.
#!/usr/bin/env bash
# Iteriert über alle .jpg- und .png-Dateien im aktuellen Verzeichnis
for file in *.{jpg,jpeg,png}; do
# Überspringt den Durchlauf, wenn keine Dateien dem Muster entsprechen
[ -e "$file" ] || continue
# Extrahiert den reinen Dateinamen
base_name=$(basename "$file")
# Konvertiert den Namen nach snake_case
# 1. Alles in Kleinbuchstaben umwandeln mit 'tr'
# 2. Leerzeichen und andere unerwünschte Zeichen durch Unterstriche ersetzen mit 'sed'
new_name=$(echo "$base_name" | tr 'A-Z' 'a-z' | sed -e 's/[[:space:]]\+/-/_/g')
# Extrahiert den Verzeichnispfad
dir_name=$(dirname "$file")
# Setzt den neuen Pfad zusammen
new_path="${dir_name}/${new_name}"
# Umbenennen, nur wenn der neue Name anders ist
if [ "$file" != "$new_path" ]; then
# Zuerst als Trockenlauf mit 'echo'
echo mv -- "$file" "$new_path"
# Echter Befehl (auskommentiert)
# mv -- "$file" "$new_path"
fi
done
Fazit
Für einfache Ersetzungen ist das rename-Kommando (sofern es die Perl-Variante ist) oft der schnellste Weg. Für maximale Kontrolle, Portabilität und komplexere Logik sind for-Schleifen mit Bash-Parameter-Expansion die robusteste Methode. Für rekursive Operationen ist die Kombination aus find und xargs oder rename unschlagbar.