von Hendrik | Juli 15, 2025 | Scripts & Snippets
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).
von Hendrik | Juli 1, 2025 | Scripts & Snippets
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!)
von Hendrik | Juni 15, 2025 | Scripts & Snippets
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
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:
#!/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
von Hendrik | Juni 15, 2025 | Scripts & Snippets
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