TASIOMIND.DEV — OPERATIONAL▸▸▸FULL STACK DEVELOPER @ GWQ SERVICEPLUS AG▸▸▸FOUNDER — K8SGPT.AI▸▸▸OPEN SOURCE: ACTIVE▸▸▸DISTRIBUTED SYSTEMS / KUBERNETES / AI▸▸▸RUST + GO + PYTHON▸▸▸FIELD TESTED / STATUS — NOMINAL▸▸▸LOCATION: EUROPE/BERLIN▸▸▸TASIOMIND.DEV — OPERATIONAL▸▸▸FULL STACK DEVELOPER @ GWQ SERVICEPLUS AG▸▸▸FOUNDER — K8SGPT.AI▸▸▸OPEN SOURCE: ACTIVE▸▸▸DISTRIBUTED SYSTEMS / KUBERNETES / AI▸▸▸RUST + GO + PYTHON▸▸▸FIELD TESTED / STATUS — NOMINAL▸▸▸LOCATION: EUROPE/BERLIN▸▸▸

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.

  1. Installation (falls erforderlich):

    code
    sudo apt update
    sudo apt install rename
    
  2. 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/' *
    
    • -n oder --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.

code
#!/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.