rm — Dateien und Verzeichnisse löschen

Praxis-Guide zu rm: Dateien und Verzeichnisse löschen, sicher mit -i/-I, rekursiv mit -rf und gefährliche Befehle wie rm -rf / vermeiden.

rm (remove) löscht Dateien und Verzeichnisse aus dem Dateisystem – und zwar endgültig: Anders als beim Verschieben in den Papierkorb landet hier nichts in einem Zwischenspeicher, gelöschte Daten lassen sich ohne Backup nicht wiederherstellen. Im Alltag brauchst du rm, um temporäre Dateien, alte Logs oder ganze Projektordner loszuwerden. Genau wegen seiner Endgültigkeit lohnt es sich, die sicheren Varianten zu kennen: rm -i fragt vor jeder Datei nach, rm -I warnt einmalig bei großen oder rekursiven Löschungen. Besondere Vorsicht gilt bei rm -rf in Kombination mit Variablen oder Glob-Mustern – ein leeres $VAR oder ein versehentliches /* kann ganze Systeme auslöschen.

Grundlegendes Löschen

rm <file> — Löscht eine einzelne Datei.

rm temp.txt

rm <file1> <file2> <file3> — Löscht mehrere Dateien auf einmal.

rm old.log debug.log error.log

rm *.tmp — Löscht alle Dateien, die auf ein Glob-Muster passen.

rm *.tmp

rm -v <file> — Ausführlicher Modus. Gibt jede Datei aus, während sie gelöscht wird.

rm -v *.log

Interaktives & sicheres Löschen

rm -i <file> — Interaktiver Modus. Fragt vor jeder Datei nach Bestätigung.

rm -i important-data.*

rm -I <files> — Fragt einmalig nach, bevor mehr als 3 Dateien oder rekursiv gelöscht wird.

rm -I *.log

rm --interactive=once <files> — Wie -I. Fragt einmalig bei Massenlöschungen nach.

rm --interactive=once /tmp/session_*

rm -f <file> — Erzwingt das Löschen. Fragt nie nach und ignoriert nicht vorhandene Dateien.

rm -f lockfile.pid

Verzeichnisse löschen

rm -r <directory> — Löscht ein Verzeichnis samt allem Inhalt rekursiv.

rm -r ./old-project/

rm -rf <directory> — Löscht ein Verzeichnis rekursiv und ohne Nachfrage. Mit äußerster Vorsicht verwenden.

rm -rf ./build/

rm -ri <directory> — Löscht ein Verzeichnis rekursiv, mit Bestätigung für jede Datei.

rm -ri ./unknown-folder/

rm -d <directory> — Löscht ein leeres Verzeichnis. Schlägt fehl, wenn es nicht leer ist.

rm -d ./empty-dir/

rmdir <directory> — Löscht ein leeres Verzeichnis (eigenständiges Kommando, wie rm -d).

rmdir ./empty-dir/

rmdir -p <path/to/nested/dir> — Löscht ein Verzeichnis und seine leeren übergeordneten Verzeichnisse.

rmdir -p ./a/b/c/

Sicherheitsoptionen

rm --preserve-root — Verweigert rekursives Arbeiten auf /. Dies ist das Standardverhalten.

rm -rf --preserve-root /some/path/

rm --preserve-root=all — Lehnt zusätzlich jedes Argument ab, das ein Mountpoint ist.

rm -rf --preserve-root=all /mnt/data/

rm --one-file-system -r <directory> — Überspringt beim rekursiven Löschen Verzeichnisse auf anderen Dateisystemen.

rm -rf --one-file-system /var/tmp/

Sonderfälle

rm -- <file> — Löscht eine Datei, deren Name mit einem Bindestrich beginnt. Das -- signalisiert das Ende der Optionen.

rm -- -strange-filename.txt

rm ./-<file> — Alternative: Eine mit Bindestrich beginnende Datei löschen, indem du ./ voranstellst.

rm ./-strange-filename.txt

rm -f <file_with_special_chars> — Erzwingt das Löschen von Dateien mit Sonderzeichen im Namen.

rm -f 'file with spaces.txt'

find <dir> -inum <inode> -delete — Löscht eine Datei anhand ihrer Inode-Nummer. Letzter Ausweg bei nicht löschbaren Dateinamen.

ls -i; find . -inum 1234567 -delete

Suchen & gezielt löschen

find <dir> -name '<pattern>' -delete — Findet und löscht Dateien nach Namensmuster. Schneller als -exec rm.

find . -name '*.tmp' -delete

find <dir> -name '<pattern>' -type f -delete — Löscht nur Dateien (keine Verzeichnisse), die auf ein Muster passen.

find . -name '.DS_Store' -type f -delete

find <dir> -empty -type d -delete — Löscht alle leeren Verzeichnisse innerhalb eines Baums.

find ./project/ -empty -type d -delete

find <dir> -mtime +<days> -delete — Löscht Dateien, die älter als N Tage sind.

find /var/log/ -name '*.log' -mtime +90 -delete

find <dir> -size +<size> -delete — Löscht Dateien, die größer als eine bestimmte Größe sind.

find /tmp/ -size +100M -delete

find <dir> -name '<pattern>' -print -delete — Gibt jede Datei vor dem Löschen aus (Kontrollausgabe).

find . -name '*.bak' -print -delete

find <dir> -name '<pattern>' -print0 | xargs -0 rm -v — Findet und löscht Dateien sicher mit ausführlicher Ausgabe. Kommt mit Leerzeichen in Dateinamen zurecht.

find . -name '*.cache' -print0 | xargs -0 rm -v

Sicherere Alternativen

mv <file> /tmp/ — Statt Löschen nach /tmp verschieben. Dateien werden beim Neustart aufgeräumt.

mv suspicious-file.dat /tmp/

trash-put <file> — Verschiebt eine Datei in den Papierkorb (Paket trash-cli). Lässt sich später wiederherstellen.

trash-put document.pdf

trash-list — Listet alle Dateien im Papierkorb auf (trash-cli).

trash-list

trash-restore — Stellt interaktiv eine Datei aus dem Papierkorb wieder her (trash-cli).

trash-restore

trash-empty — Leert den Papierkorb endgültig (trash-cli).

trash-empty

alias rm='rm -I' — Shell-Alias, der vor Massenlöschungen immer nachfragt.

alias rm='rm -I'

Gefährliche Befehle, die du vermeiden solltest

rm -rf / — NIEMALS AUSFÜHREN. Versucht, das gesamte Dateisystem zu löschen. Wird durch das standardmäßige --preserve-root blockiert.

# DO NOT RUN — destroys your entire system

rm -rf /* — NIEMALS AUSFÜHREN. Umgeht --preserve-root, indem /* zu einzelnen Pfaden expandiert. Löscht alles.

# DO NOT RUN — the glob expansion bypasses root protection

rm -rf $VARIABLE/ — GEFÄHRLICH, wenn die Variable leer oder nicht gesetzt ist. Expandiert zu rm -rf / und löscht alles.

# ALWAYS quote and check: rm -rf "${DIR:?Variable not set}/"

rm -rf "${DIR:?}"/* — Sicheres Muster. Das :? lässt die Shell mit einem Fehler abbrechen, falls DIR leer oder nicht gesetzt ist.

DIR=/var/cache/app; rm -rf "${DIR:?Variable not set}"/*

Fazit

rm ist mächtig und endgültig: Es kennt keinen Papierkorb, und einmal gelöschte Daten sind ohne Backup verloren. Für den Alltag reichen meist rm <datei>, rm -r <verzeichnis> und beim Aufräumen die find … -delete-Muster. Mach dir die gefährlichen Fälle bewusst: rm -rf mit einer leeren Variable, einem versehentlichen Leerzeichen vor / oder einem /* kann ein ganzes System auslöschen. Zwei einfache Gewohnheiten schützen dich – quote und prüfe Variablen mit "${DIR:?}", und setze einen alias rm='rm -I', damit die Shell vor Massenlöschungen nachfragt. Wenn du Wiederherstellbarkeit brauchst, nutze trash-cli statt rm.

Verwandte Kommandos

  • mv – Dateien verschieben oder umbenennen statt löschen
  • cp – Dateien und Verzeichnisse kopieren
  • find – Dateien suchen und gezielt mit -delete entfernen