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).
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 undrm -r
das Verzeichnis selbst aufzurufen und es bei Bedarf neu zu erstellen..*
, erlaubt POSIX keine Auflistung..
.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.rm -rf
wird niemals löschen.
oder..
, auch wenn dies ausdrücklich gesagt wird. Siehe hier .Antworten:
Vergessen Sie nicht die Möglichkeit, dass der Server, der nach dem
rm
Befehl 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 *
:*
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.exec()
s die erste Version vonrm
Gefunden in Ihrem$PATH
, mit-rf
als erstes Argument, und die angepassten Dateien, eins nach dem anderen , wie die aufeinander folgenden Argumente.Wenn der
rm
aufgerufenerm
Befehl 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 verwendengetopt()
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-root
im aktuellen Verzeichnis hätten, wäre dies als Option interpretiert wordenrm
, nicht als zu entfernender Dateiname!Seien Sie vorsichtig mit Platzhaltern (und mit der Benennung von Dateien). Wenn Sie eine Datei
-r
im 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 anrm
und 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 ./--flagfile
oderrm /abs/path/to/--flagfile
.Es gibt auch ein
-i
Flagrm
, das es auffordert ("interaktiv"), bevor etwas entfernt wird.quelle
--
eine GNU-Funktion ist, die möglicherweise nicht in allenrm
Versionen vorhanden ist. Der andere Weg , um die Datei mit dem Namen zu entfernen-r
istrm ./-r
. Ich schlage vor, dies in Ihrer Antwort zu erwähnen.--
ist POSIX, nicht GNU.