Löscht rm -rf * Dateien rekursiv aus dem aktuellen Verzeichnis oder dem Eltern- / Stammverzeichnis?

7

Ich wollte Dateien und Ordner rekursiv aus einem bestimmten Ordner löschen, also habe ich diesen Befehl aus diesem Ordner ausgeführt

rm -rf *

Ich ging davon aus, dass alle Dateien / Verzeichnisse im aktuellen Verzeichnis rekursiv gelöscht werden. Danach ist etwas Schlimmes passiert (mein Server ist ausgefallen und erhält nicht einmal eine Ping-Antwort).

Windows
quelle
1
Ohne zu wissen, wo genau Sie diesen Befehl ausgeführt haben, ist es schwer zu sagen, warum das so ist, aber es scheint, dass Sie etwas gelöscht haben, das Ihr System benötigt, um zu funktionieren. rm -rf *macht so ziemlich das, was Sie sagen (mit Ausnahme der Tatsache, dass versteckte Dateien ignoriert werden). Im Allgemeinen ist es besser, ein Verzeichnis und rm -rdas Verzeichnis selbst aufzurufen und es bei Bedarf neu zu erstellen.
Chris Down
Ich wollte nur wissen, ob es Dateien / Ordner rekursiv unter dem aktuellen Verzeichnis oder Stamm löscht.
Windows
3
Dies geschieht nur unter dem aktuellen Verzeichnis. Selbst wenn Sie eingegeben haben .*, erlaubt POSIX keine Auflistung ...
Chris Down
3
Sogar rm -Rf --no-preserve-root /wird die Maschine normalerweise pingbar lassen. Der Kernel wird aus dem RAM ausgeführt und auch dann weiter ausgeführt, wenn die Dateisysteme zerstört werden.
Derobert
1
rm -rfwird niemals löschen .oder .., auch wenn dies ausdrücklich gesagt wird. Siehe hier .
Terdon

Antworten:

11

Vergessen Sie nicht die Möglichkeit, dass der Server, der nach dem rmBefehl nicht erreichbar ist, nichts damit zu tun hat. Es könnte ein Zufall sein!

Höchstwahrscheinlich war das aktuelle Arbeitsverzeichnis jedoch nicht das, was Sie dachten, als der Befehl ausgegeben wurde.

Warst du dabei root?

Folgendes passiert bei der Ausgabe des Befehls rm -rf *:

  1. Die Shell löst die Platzhaltermuster ( *in diesem Fall) in alle Dateien (einschließlich Verzeichnisse, symbolische Links und Gerätespezialdateien) auf, die dem verwendeten Globbing-Muster entsprechen. In diesem Fall beginnt alles, was nicht mit einem .Normalerweise beginnt , "alphabetisch" nach dem Schale.
  2. Die Schale gabelt sich dann einen neuen Prozess und exec()s die erste Version von rmGefunden in Ihrem $PATH, mit -rfals erstes Argument, und die angepassten Dateien, eins nach dem anderen , wie die aufeinander folgenden Argumente.

Wenn der rmaufgerufene rmBefehl der Standardbefehl war , analysiert er zuerst die Argumente nacheinander und behandelt alle Argumente (einschließlich der Argumente, die sich aus dem Shell-Globbing ergeben), die mit a beginnen, -als Optionen, bis es zu einem Argument kommt, das nicht mit einem -( beginnt) mit Ausnahme von Befehlen, die GNU verwenden getopt()und Optionen nach Nichtoptionen akzeptieren) oder genau --. Alles danach wird als Dateiname betrachtet.

Mit anderen Worten, wenn Sie eine Datei mit dem Namen (zum Beispiel) --no-preserve-rootim aktuellen Verzeichnis hätten, wäre dies als Option interpretiert worden rm, nicht als zu entfernender Dateiname!

Seien Sie vorsichtig mit Platzhaltern (und mit der Benennung von Dateien). Wenn Sie eine Datei -rim aktuellen Verzeichnis haben, ls *listet der Befehl die anderen Dateien in umgekehrter Reihenfolge auf und zeigt die Datei '-r' nicht an.

Mit anderen Worten, wenn Sie eine Datei aufgerufen hätten --no-preserve-root, wäre diese als Option an rmund nicht als Dateiname übergeben worden.

Verwenden Sie rm -rf -- *diese Option , um dies zu verhindern, und entfernen Sie auch die Dateien, die mit beginnen -. Oder verwenden Sie einfach absolute oder relative Pfadnamen, damit die Dateinamen mit etwas anderem beginnen als -wie in: rm ./--flagfileoder rm /abs/path/to/--flagfile.

Es gibt auch ein -iFlag rm, das es auffordert ("interaktiv"), bevor etwas entfernt wird.

MattBianco
quelle
2
Beachten Sie, dass dies --eine GNU-Funktion ist, die möglicherweise nicht in allen rmVersionen vorhanden ist. Der andere Weg , um die Datei mit dem Namen zu entfernen -rist rm ./-r. Ich schlage vor, dies in Ihrer Antwort zu erwähnen.
Derobert
3
@derobert, nein. --ist POSIX, nicht GNU.
Stéphane Chazelas