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.

Trackbacks

blog.der-link.de on : rm -rf / vs. rm -rf /*

Show preview
rm -rf /, vielen auch bekannt als “read mail really fast” löscht ja bekanntlich ohne Rückfrage alles, vom angegebenen Pfad an(in diesem Fall “root”). Nun macht es einen Unterschied, ob man schreibt / oder /*. Bei der Variante mit Stern kann man Glück

Comments

Display comments as Linear | Threaded

hoelli on :

Also mir war rm -rf als “read manual, real fast” in ERinnerung!

Add Comment

Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.
Standard emoticons like :-) and ;-) are converted to images.
BBCode format allowed
E-Mail addresses will not be displayed and will only be used for E-Mail notifications.

To prevent automated Bots from commentspamming, please enter the string you see in the image below in the appropriate input box. Your comment will only be submitted if the strings match. Please ensure that your browser supports and accepts cookies, or your comment cannot be verified correctly.
CAPTCHA

Form options
tweetbackcheck