Werden rm -rf *
alle Dateien / Ordner im aktuellen Verzeichnis entfernt? Ich möchte sicherstellen, dass der Platzhalter *
nicht in den oberen Verzeichnissen aufsteigt und mein gesamtes Dateisystem löscht. : D
Ich erinnere mich chmod 777 .* -R
an chmod
versteckte Dateien und chmod
mein gesamtes Dateisystem. Offensichtlich war ich auf dem Root-Account.
rm -rf ./*
das aktuelle Verzeichnis tun und explizit angeben ... aber Ankur scheint zu sagen, dass es sowieso keine Rolle spielt.Antworten:
Nein, wenn Sie Ihre Shell nicht viel optimiert haben, werden dadurch keine Dateien oder Verzeichnisse entfernt, die mit a beginnen
.
. Um sie auch zu entfernen, können Sie sie entweder explizit auflistenoder benutze die richtigen Glob-Muster (danke Chris)
BEARBEITEN Der Punkt hier ist, dass Sie nicht verwenden können
.*
, um Dateien wie.file
, weil.*
oder.*?
auch..
oder zuzuordnen.
..[^.]*
Sucht nach Dateien wie.file
, und..?*
sucht nach Dateien wie..foo
(*
sucht nach null oder mehr Zeichen und?
sucht nach genau einem).quelle
..?*
, um Einträge abzufangen, die mit ".." beginnen (zB..foo
).rm
. Daher ist das Löschen des Inhalts eines Verzeichnisses mit * nicht der klügste Weg, imho.xargs
geht etwas über den Rahmen dieser Frage hinaus. Man könnte zB darüber nachdenken, wenn die Shell die Länge der Argumentliste beanstandet.Wenn Sie ein Verzeichnis und seinen gesamten Inhalt entfernen möchten, können Sie
chdir
das übergeordnete Verzeichnis undrm -rf
dieses Verzeichnis unter Umgehung der gesamten globalen Frage nach Namen sortieren. Wenn Sie den Inhalt entfernen und das Verzeichnis behalten möchten, ist es am einfachsten, alle zu entfernen und dann das Verzeichnis neu zu erstellen.Es ist kompliziert, einen Glob zu entwickeln, der allen möglichen Verzeichniseinträgen entspricht, die gespeichert werden. und ..; Es ist einfach, eine einfache Antwort zu finden (z. B.
* .??*
), die in der Praxis fast immer funktioniert. Dies ist für die interaktive Verwendung in Ordnung, da es leicht zu merken ist und die Zeiten, in denen es nicht funktioniert, mit einem Post-RM abgefangen werden könnenls -a
. Bei einem Skript ist es einfacher, alle zu entfernen und das leere Verzeichnis neu zu erstellen.quelle
Da ich der Meinung bin, dass sich diese Frage eher darauf bezieht, was * tut (und nicht rm), versuchen wir es mit einem anderen Ansatz.
Wenn Sie sich nicht sicher sind, was das * bewirkt, können Sie es zuerst mit einem harmlosen Befehl wie echo "testen". Versuchen Sie, bevor Sie dies ausführen, zu erraten, was sie anzeigen, wenn Sie sie in Ihrem Heimverzeichnis ausführen.
Aber zuerst wollen wir einen Spielplatz schaffen, auf dem wir mit den Sternen spielen und sehen können, womit wir enden.
In diesem Verzeichnis haben wir Folgendes:
Beachten Sie nun, zu was das * mit dem Befehl echo erweitert wird:
Mal sehen, was mit dem Befehl rm passiert
Wie Sie sehen, hat er nur die Datei2 entfernt, da * nur zu Datei2 erweitert wurde. Wenn Sie rm -rf. * Eingeben würden, wäre das dasselbe wie Schreiben
Und um ehrlich zu sein, das sieht nicht lustig aus;)
Hoffe, dies klärt den * Teil Ihrer Frage.
Update: Ankur Goel weist jedoch darauf hin, dass in rm eine Art Schutz integriert ist (ungewöhnlich für Shell-Befehle :)
Erstellen wir einen neuen Spielplatz:
Jetzt haben wir das also wieder, aber mit test1 im Besitz von root als Schutz, wenn ich anfange wütend zu werden.
Also lasst uns alles entfernen:
Und es sieht aus wie rm nicht entfernt hat. und ... auch wenn wir es ihm sagten !!!
Nach dieser langen Antwort erweist es sich als sicher, alles in einem Verzeichnis zu entfernen:
Aber ich würde dies mit Vorsicht verwenden, da ich nicht sicher bin, ob sich alle Implementierungen von rm so verhalten!
quelle
Ja. Mit rm -rf werden nur Dateien und Ordner im aktuellen Verzeichnis gelöscht, und der Dateibaum wird nicht nach oben verschoben. rm folgt auch keinen Symlinks und löscht die Dateien, auf die es verweist, damit Sie nicht versehentlich andere Teile Ihres Dateisystems entfernen.
quelle
Wenn Sie nicht eine Ebene nach oben verschieben möchten, wie in mpez0 und
rm -rf
diesem bestimmten Ordner beschrieben, können Sie alle Verzeichnisse / Dateien außer.
und..
im aktuellen Ordner bearbeiten, indem Sie folgende Schritte ausführen :Wenn eines der Verzeichnisse / Dateien eines der Zeichen in der Shell-
IFS
Sondervariablen enthält (z. B. Leerzeichen, Tabulator, Zeilenvorschub), möchten Sie möglicherweise zuerst das IFS ändern, den Befehl ausführen und dann das IFS wiederherstellen.quelle
Eine viel einfachere Methode zum Leeren eines gesamten Ordners, bei der auch die in dieser Antwort behandelten Probleme mit zu vielen Argumenten vermieden werden , besteht darin, das Verzeichnis selbst einfach zu löschen und neu zu erstellen. Verwenden Sie die folgenden Zeilen, um sicherzustellen, dass dies ordnungsgemäß funktioniert, wenn Sie sich in einem verknüpften Verzeichnis befinden:
(Wenn Sie
yourdir
anstelle von verwenden$(readlink -f yourdir)
, ersetzen Sie den Link nur, während der ursprüngliche Speicherort voll bleibt.)quelle
xargs
...