Skip to content

Unterschiede beim rekursiven Löschen

Vor einigen Tagen verabschiedete sich ein Nutzer im IRC mit rm -rf /* als Kommentar. Dies löste eine Diskussion aus, ob es denn einen Unterschied zwischen rm -rf / und rm -rf /* gibt, wenn root dies ausführt. Natürlich war die Antwort, es gibt einen Unterschied, schnell gefunden. Jedoch gab es Differenzen, wie denn diese Unterschiede aussehen. Mein Ansatz sieht folgendermaßen aus:

Die Eingabe rm -rf / wird manchmal scherzhaft als read mail really fast bezeichnet und sollte jedem Linuxnutzer bekannt sein. Dem Befehl rm (remove, löschen) werden die Optionen -r (rekursiv) und -f (force, zwingen) zusammen mit dem Pfad übergeben. Nun begibt sich rm auf eine lange Reise und steigt den Verzeichnisbaum hinab. Unten angekommen, beginnt es alle Verzeichnisse zu löschen. Dies geschieht solange, bis rm wieder im Wurzelverzeichnis angekommen ist. Wenn der Befehl also erfolgreich ausgeführt wurde, ist das komplette Dateisystem gelöscht. (Don’t try this at home, kids!)

Bei der Eingabe von rm -rf /* macht der Stern den kleinen, aber feinen Unterschied. Nachdem die Eingabe bestätigt wurde, wird diese nicht direkt ausgeführt, sondern die Shell expandiert den Stern. Das bedeutet, sie versucht, alle Dateien und Verzeichnisse zu ersetzen. Nachdem die Shell ihre Arbeit erledigt hat, könnte die wirkliche Eingabe, die der Befehl rm bearbeiten muss, so aussehen: rm -rf /bin /boot /dev /etc /home /lib /proc /root /sbin /tmp /usr /var. Bereits hier tritt der erste Unterschied zu tage. Denn für den (unwahrscheinlichen) Fall, dass unterhalb des Wurzelverzeichnis sehr viele Dateien oder Verzeichnisse abgelegt wurden, kann die Shell die Expansion nicht durchführen. Sie bricht dann mit dem Fehler argument list too long ab. Somit würde die Eingabe nicht abgearbeitet werden. Wenn die Shell die Einträge expandieren kann, wird wie im obigen Fall der Verzeichnisbaum durchlaufen und alle Dateien und Verzeichnisse werden gelöscht. Wirklich alle? Nein! Denn es gibt solche, die mit einem Punkt beginnen. Liegt eine solche Datei oder Verzeichnis direkt unterhalb des Wurzelverzeichnisses (also .bar, nicht /foo/.bar), wird dieser Eintrag nicht mit von der Expansion erfasst. In der Folge wird es auch nicht dem Befehl rm übergeben und somit auch nicht gelöscht.

Der wesentliche Unterschied in beiden Befehlen liegt also darin, dass rm -rf / rücksichtslos wirklich alles löscht. Währenddessen löscht rm -rf /* unter bestimmten Umständen entweder gar nichts oder es lässt Dateien und Verzeichnisse, die mit einem Punkt beginnen und im Wurzelverzeichnis liegen unangetastet. Beide Befehle sollte man immer mit äußerster Vorsicht anwenden.

cronjob