Linux-Script: Ordner und Dateien rekursiv umbenennen

Linux-Script: Ordner und Dateien rekursiv umbenennen

Jeder, der mit Linux arbeitet, kennt das Problem: Dateien und Ordner mit Leerzeichen, Umlauten oder Sonderzeichen im Namen. Das kann nicht nur in Skripten oder bei der Verarbeitung mit anderen Programmen zu Fehlern führen, sondern macht das Arbeiten im Terminal auch unnötig kompliziert. In diesem Beitrag zeige ich dir, wie du mit einem einzigen Shellscript alle diese Probleme behebst – rekursiv und automatisch!

Warum sollte man Dateinamen bereinigen?

Ordner- und Dateinamen mit Sonderzeichen, Leerzeichen oder Umlauten verursachen in vielen Situationen Probleme, etwa bei:

  • Verwendung in Skripten oder Programmen
  • Datenübertragungen auf andere Systeme (z.B. Windows zu Linux)
  • Backup- und Sync-Prozessen
  • Versionierung mit Git

Ein einheitliches und sauberes Dateisystem ist übersichtlicher und vermeidet viele Fehlerquellen.

Das Shellscript im Detail

Mit folgendem Bash-Script werden rekursiv in allen Unterordnern Dateien und Ordner gefunden, deren Namen unerwünschte Zeichen enthalten. Anschließend werden diese Zeichen durch Unterstriche ersetzt. Besonders berücksichtigt werden:

#!/bin/bash

ROOT="${1:-.}"

function clean_name() {
    local name="$1"
    # Umlaute und ß ersetzen
    name="${name//ä/ae}"
    name="${name//ö/oe}"
    name="${name//ü/ue}"
    name="${name//Ä/Ae}"
    name="${name//Ö/Oe}"
    name="${name//Ü/Ue}"
    name="${name//ß/ss}"
    # Alle Zeichen außer Buchstaben, Zahlen und Unterstrich ersetzen
    name=$(echo "$name" | sed 's/[^A-Za-z0-9_]/_/g')
    # Mehrere Unterstriche zusammenfassen
    name=$(echo "$name" | sed 's/__*/_/g')
    echo "$name"
}

export -f clean_name

find "$ROOT" -depth | while IFS= read -r OLD; do
    DIR=$(dirname "$OLD")
    BASE=$(basename "$OLD")
    NEWBASE=$(clean_name "$BASE")

    if [[ "$BASE" != "$NEWBASE" ]]; then
        NEW="$DIR/$NEWBASE"
        if [[ ! -e "$NEW" ]]; then
            mv "$OLD" "$NEW"
            echo "Renamed: $OLD → $NEW"
        else
            echo "WARNUNG: $NEW existiert schon, $OLD wurde nicht umbenannt!"
        fi
    fi
done

Anwendung des Scripts

Speichern: Kopiere das Script in eine Datei, z.B. rename_recursive.sh und mache es ausführbar:

chmod +x rename_recursive.sh

ausführen:
Für das aktuelle Verzeichnis:

./rename_recursive.sh

Oder für ein bestimmtes Verzeichnis:

./rename_recursive.sh /pfad/zum/ordner

Das Script geht alle Unterverzeichnisse durch und ersetzt problematische Zeichen zuverlässig.

Beispiele

Vorher:

  • Fall 2. 24,11
  • Mein-Ordner mit Ä und Ö!
  • Projekt, Version 1.2

Nachher:

  • Fall_2_24_11
  • Mein_Ordner_mit_Ae_und_Oe_
  • Projekt_Version_1_2

FAQ

Wie sicher ist das Script?

Das Script prüft vor dem Umbenennen, ob der neue Name bereits existiert. Trotzdem empfiehlt sich ein Backup vor der ersten Anwendung!

Werden auch Dateinamen geändert?

Ja, sowohl Dateien als auch Ordner werden angepasst.

Kann ich das Script anpassen?

Natürlich! Du kannst die Zeichen im clean_name-Bereich beliebig ergänzen oder Ausnahmen hinzufügen.

Darf ich Punkte oder bestimmte Zeichen behalten?

Dann passe die Zeile
s/[^A-Za-z0-9_]/_/g
zum Beispiel zu
s/[^A-Za-z0-9_.]/_/g
an (behalte den Punkt).

Docker Basics & Power Snippets für Ubuntu 24.04 Teil 1

Docker Basics & Power Snippets für Ubuntu 24.04 Teil 1

Docker ist heute das Herzstück vieler moderner Software- und Entwicklungsumgebungen – auch auf Ubuntu 24.04. Mit Containern lässt sich Software unabhängig, schnell, sicher und flexibel bereitstellen und verwalten. Gerade für Entwickler, Admins und DevOps-Teams ist das Wissen um die wichtigsten Docker-Befehle Gold wert.
Neben den bekannten Kommandos gibt es viele Power-Snippets und clevere One-Liner, die den Alltag enorm erleichtern – ob beim Starten, Stoppen, Debuggen, Überwachen oder Aufräumen von Containern und Images.
Im folgenden Abschnitt findest du eine Zusammenstellung der wichtigsten und nützlichsten Docker-Befehle für Ubuntu 24.04, inklusive hilfreicher Tipps für die tägliche Arbeit.

1. Images & Container verwalten

# Liste aller laufenden Container
docker ps

# Liste aller Container (auch gestoppte)
docker ps -a

# Liste aller lokalen Images
docker images

# Image herunterladen (pull)
docker pull ubuntu:24.04

# Container starten (im Hintergrund, mit Name)
docker run -d --name mein-nginx nginx:latest

# Container mit Shell starten (interaktiv)
docker run -it --rm ubuntu:24.04 bash

2. Container steuern

# Einen Container stoppen
docker stop <containername>

# Einen Container starten (der gestoppt wurde)
docker start <containername>

# Einen Container entfernen (löschen)
docker rm <containername>

# Ein Image entfernen
docker rmi <imagename>

3. In laufende Container einsteigen

# Shell in einen laufenden Container bekommen
docker exec -it <containername> bash
# (oder sh, wenn bash nicht installiert ist)

4. Logs & Ressourcen

# Logs eines Containers live verfolgen
docker logs -f <containername>

# Nur die letzten 100 Zeilen anzeigen
docker logs --tail 100 <containername>

# Ressourcenverbrauch aller Container anzeigen
docker stats

5. Dateien kopieren

# Datei vom Host in den Container kopieren
docker cp /pfad/zur/datei <containername>:/pfad/im/container

# Datei aus dem Container auf den Host kopieren
docker cp <containername>:/pfad/im/container /ziel/pfad/auf/dem/host

6. Netzwerk & Ports

# Alle Docker-Netzwerke anzeigen
docker network ls

# Ins Netzwerk eines Containers „eintreten“ (z. B. für Troubleshooting)
docker run -it --network container:<containername> alpine sh

7. Volumes

# Alle Volumes anzeigen
docker volume ls

# Ein Volume inspizieren
docker volume inspect <volumename>

# Ungenutzte Volumes löschen
docker volume prune

8. Clean-Up & Platz sparen

# Alle gestoppten Container löschen
docker container prune

# Nicht mehr verwendete Images löschen
docker image prune

# ALLES Unbenutzte löschen (Container, Images, Volumes, Netzwerke)
docker system prune -a

9. Docker Compose

# Container aus docker-compose.yml starten
docker compose up -d

# Logs aller Dienste anzeigen
docker compose logs -f

# Services stoppen und entfernen
docker compose down

# Ein einzelnes Service neustarten
docker compose restart <servicename>

10. Weniger bekannt, aber nützlich

# Prozessliste eines Containers ansehen (wie top)
docker top <containername>

# Umgebungsvariablen eines Containers inspizieren
docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' <containername>

# Änderungen am Dateisystem eines laufenden Containers anzeigen
docker diff <containername>

# Einen neuen Image-Tag vergeben (taggen)
docker tag <image_id> meinrepo/meinimage:neuer-tag

# Ein Image exportieren (z. B. für Backup oder Transfer)
docker save -o image.tar <imagename>
# Importieren
docker load -i image.tar

# Einen Befehl ausführen, wenn der Container startet (override entrypoint)
docker run --entrypoint /bin/sh -it <image>

11. Troubleshooting

# Container Netzwerk-Probleme debuggen
docker exec -it <containername> ping 8.8.8.8

# Health-Status von Containern sehen
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}\t{{.Image}}'

# Aufräumen, alles was nicht genutzt wird
docker system prune -a --volumes

12. Extra: Shell-Tools für Vielnutzer

# Bash-Completion für Docker aktivieren (sehr nützlich!)
sudo apt install bash-completion
echo "source /usr/share/bash-completion/completions/docker" >> ~/.bashrc

# Fuzzy-Auswahl für Container/Images mit fzf (bei vielen Containern/Images mega hilfreich!)
docker ps -a --format '{{.Names}}' | fzf | xargs -I {} docker logs -f {}
13. Quick-One-Liner: „Alle Container löschen“ (mit Vorsicht!)
bash
Kopieren
Bearbeiten
docker rm -f $(docker ps -aq)
(Löscht ALLE Container, auch laufende!)

 

 

Bilder für das Web aufbereiten

Bilder für das Web aufbereiten

Tools installieren

Die wichtigsten Tools:

  • ImageMagick (mächtig, wandelt/skalieren/umbenennen/etc.)

  • jpegoptim (optimiert JPEGs)

  • optipng (optimiert PNGs)

  • mogrify (Teil von ImageMagick, arbeitet auf Stapel)

Installiere alles (Ubuntu/Debian):

sudo apt update
sudo apt install imagemagick jpegoptim optipng

Bilder skalieren und konvertieren (ImageMagick)

Beispiel: Alle Bilder auf maximale Breite 1200px bringen (Höhe automatisch, Verhältnis bleibt)

mogrify -resize 1200x1200\> -path ./output/ *.jpg *.jpeg *.png
  • Alle Bilder werden kopiert und skaliert ins Verzeichnis output/.

  • Nur Bilder, die größer sind, werden verkleinert.

  • *.jpg *.jpeg *.png funktioniert mit Bash, ansonsten einzeln laufen lassen.

Komprimieren / Optimieren

JPEG:

jpegoptim --max=80 --strip-all ./output/*.jpg
  • Qualität auf 80% (guter Standardwert)

  • Entfernt EXIF-Daten und Kommentare

PNG:

  • Starke Kompression (verlustfrei bei PNG)
optipng -o7 ./output/*.png

Optional: In WebP konvertieren

WebP bietet noch bessere Kompression für’s Web:

  • Erzeugt WebP-Bilder mit Qualität 80
sudo apt install webp
cd output/
for i in *.jpg *.jpeg *.png; do
  cwebp -q 80 "$i" -o "${i%.*}.webp"
done

Dateinamen anpassen (optional)

Um Leerzeichen zu vermeiden oder Kleinschreibung zu erzwingen:

rename 'y/A-Z/a-z/' *.JPG
rename 's/ /_/g' *

Kurzes Komplett-Beispiel (als Script):

Speichere das Folgende z. B. als bilder-weboptimieren.sh im Bilder-Ordner und mache es mit chmod +x bilder-weboptimieren.sh ausführbar:
#!/bin/bash

# --- Variablen und Hilfetext ---
SRC="$1"
DST="${2:-output}"

if [ -z "$SRC" ] || [ ! -d "$SRC" ]; then
  echo "Nutzung: $0 QUELLORDNER [ZIELORDNER]"
  echo "Beispiel: $0 ./meine_bilder ./fertig_fürs_web"
  exit 1
fi

mkdir -p "$DST"

# --- Skalieren ---
echo "Skaliere Bilder aus '$SRC' nach '$DST' (max 1200px)..."
mogrify -resize 1200x1200\> -path "$DST" "$SRC"/*.jpg "$SRC"/*.jpeg "$SRC"/*.png

# --- JPEG optimieren ---
echo "Optimiere JPEGs..."
jpegoptim --max=80 --strip-all "$DST"/*.jpg "$DST"/*.jpeg

# --- PNG optimieren ---
echo "Optimiere PNGs..."
optipng -o7 "$DST"/*.png

# --- WebP optional (auskommentieren, falls nicht benötigt) ---
# echo "Konvertiere nach WebP..."
# for i in "$DST"/*.jpg "$DST"/*.jpeg "$DST"/*.png; do
#   [ -e "$i" ] || continue
#   cwebp -q 80 "$i" -o "${i%.*}.webp"
# done

echo "Fertig! Optimierte Bilder liegen in: $DST"

Aufrufen mit Quell- und Zielordner:

./bilder-weboptimieren.sh ./mein_bilderordner ./fertig_fürs_web
  • Quellordner: Pflicht

  • Zielordner: Optional, sonst wird output verwendet.

Code-Snipptes für Vim

Code-Snipptes für Vim

Spezielle und weniger bekannte Code-Snippets für Vim

Fügt die Zahlen von 1 bis 10 in aufeinanderfolgenden Zeilen ein.

:put =range(1, 10)

HTML-Tags automatisch um Text herum einfügen

Markiere einen Textbereich, drücke <leader>t und gib einen HTML-Tag ein, um den markierten Bereich in diesen Tag einzuschließen.

vnoremap <leader>t <Esc>`<i<<C-r>=input("Tag: ")<CR>><Esc>`>a</<C-r>=input("Tag: ")<CR>><Esc>

Schnelle Dateinavigation mit Register

Zeigt alle geöffneten Buffers an und erlaubt schnelles Umschalten zwischen ihnen.

nnoremap <leader>b :ls<CR>:b<Space>

Zeilen in alphabetischer Reihenfolge sortieren

Markiere die gewünschten Zeilen im visuellen Modus und führe den Befehl aus, um sie alphabetisch zu sortieren.

:'<,'>sort

Zeilen innerhalb eines Blocks kommentieren

Markiere einen Block und drücke <leader>c, um alle Zeilen zu kommentieren (hier mit //).

xnoremap <leader>c :s/^/\/\/ /<CR>

Wörter umkehren

Dieser Befehl kehrt jedes Wort in der Datei um.

:%s/\w\+/\=join(reverse(split(submatch(0), '.\zs')), '')/g

Umschalten zwischen relativen und absoluten Zeilennummern

Drücke <leader>n, um zwischen absoluten und relativen Zeilennummern zu wechseln.

nnoremap <leader>n :set invnumber invrelativenumber<CR>

Nur Zahlen in einem Text extrahieren

Löscht alle Zeilen, die keine Zahlen enthalten.

:g/[^0-9]/d

Anpassen der .vimrc mit zusätzlichen Funktionen

" Grundlegende Einstellungen
set nocompatible         " Deaktiviert Kompatibilität mit Vi
set number               " Zeilennummern anzeigen
set relativenumber       " Relative Zeilennummern anzeigen
set showcmd              " Zeigt eingegebene Befehle unten an
set cursorline           " Hervorheben der aktuellen Zeile
set wildmenu             " Bessere Autovervollständigung im Befehlsmodus
set hlsearch             " Suchergebnisse hervorheben
set incsearch            " Inkrementelle Suche aktivieren
set ignorecase           " Suche ohne Berücksichtigung der Groß-/Kleinschreibung
set smartcase            " Berücksichtigt Groß-/Kleinschreibung, wenn Großbuchstaben verwendet werden
set clipboard=unnamedplus " Zwischenablage mit System teilen
 
" Tab- und Einrückungseinstellungen
set expandtab            " Tabs in Spaces umwandeln
set tabstop=4            " Tabweite auf 4 Spaces setzen
set shiftwidth=4         " Einrückung auf 4 Spaces setzen
set autoindent           " Automatische Einrückung aktivieren
 
" Statuszeile immer anzeigen
set laststatus=2
 
" Dateitypabhängige Einstellungen
autocmd FileType python setlocal expandtab tabstop=4 shiftwidth=4
autocmd FileType make setlocal noexpandtab
 
" Entfernen von Leerzeichen am Zeilenende beim Speichern
autocmd BufWritePre * %s/\s\+$//e
 
" Automatische Speicherung bei Fokusverlust
autocmd FocusLost * :wa
 
" Cursorposition beim erneuten Öffnen einer Datei wiederherstellen
autocmd BufReadPost * if line("'\"") > 0 && line("'\"") <= line("$") | exe "normal! g`\"" | endif
 
" Schnelles Umschalten zwischen letzten zwei Buffern
nnoremap <leader><leader> <C-^>
 
" Hintergrundfarbe je nach Tageszeit wechseln
autocmd VimEnter * if strftime("%H") < 18 | colorscheme morning | else | colorscheme evening | endif
 
" Bessere Navigation für lange Zeilen
nnoremap j gj
nnoremap k gk
 
" Highlight der aktuellen Zeile im Einfügemodus deaktivieren
autocmd InsertEnter * set nocursorline
autocmd InsertLeave * set cursorline
 
" Zahlenreihen einfügen
command! -nargs=1 NumberSeq put =range(1, <args>)

.vimrc speichern

Füge den obigen Inhalt ein und speichere die Datei mit :wq

Lade die Konfiguration neu, indem du :source ~/.vimrc in Vim ausführst, oder starte Vim neu.

vim ~/.vimrc