Entfernt rm -rf * alle Dateien / Ordner im aktuellen Verzeichnis?

32046
Olivier Lalonde

Werden rm -rf *alle Dateien / Ordner im aktuellen Verzeichnis entfernen? Ich möchte sicherstellen, dass der Platzhalter *nicht in die oberen Verzeichnisse verschoben wird und dass mein gesamtes Dateisystem gelöscht wird. : D

Ich erinnere mich dabei chmod 777 .* -Ran chmodDateien und es chmoded alle meine Dateisystem. Offensichtlich war ich im Root-Konto.

20
Aus diesem Grund würde ich `rm -rf ./*` verwenden und das aktuelle Verzeichnis explizit angeben ... aber Ankur scheint zu sagen, dass es sowieso egal ist. mpen vor 14 Jahren 1
@ Mark: Was ist der Unterschied zwischen .. und ./ ..? Sie können versuchen, eine CD zu erstellen ./ .. und sehen, wo Sie enden :) Johan vor 14 Jahren 0
@Johan: Kein Unterschied ... Ich denke, es macht in meinem verrückten Kopf einfach mehr Sinn: D mpen vor 14 Jahren 0
@ Mark: einfacher Fehler zu tun :) Johan vor 14 Jahren 0

6 Antworten auf die Frage

15
Benjamin Bannier

Nein, wenn Sie Ihre Shell nicht viel angepasst haben, werden Dateien oder Verzeichnisse, die mit a beginnen, nicht entfernt .. Um sie auch zu entfernen, können Sie sie entweder explizit auflisten

rm -rf .file .dir 

oder benutze die richtigen Glob-Muster (danke Chris)

rm -rf .[^.]* ..?* 

EDIT hier Der Punkt ist, dass Sie nicht verwenden können, .*wie Dateien übereinstimmen .file, da .*oder .*?auch übereinstimmen ..oder .. .[^.]*vergleicht Dateien wie .file, während ..?*Dateien übereinstimmen wie ..foo( *entspricht null oder mehr Zeichen ?, aber genau einem).

Sie benötigen auch etwas wie "..? *", Um Einträge zu fangen, die mit ".." beginnen (zB "..foo"). Chris Johnsen vor 14 Jahren 1
@ Chris: OK, ich habe diesen wählerischen Wahnsinn angefangen, du hast recht;) Benjamin Bannier vor 14 Jahren 0
Es geht nicht nur um die "richtigen" Glob-Muster, sondern auch um die Anzahl der übereinstimmenden Elemente. In Verzeichnissen mit einer großen Anzahl von Dateien kann die Shell höchstwahrscheinlich keine 50-KB-Dateien in einer Runde an `rm` übergeben. Daher ist das Löschen des Inhalts eines Verzeichnisses mit * nicht der klügste Weg, imho. akira vor 14 Jahren 0
Ich denke, das Erklären von "xargs" liegt etwas außerhalb des Rahmens dieser Frage. Man könnte beispielsweise darüber nachdenken, wenn die Shell Argumentlistenlängen beanstandet. Benjamin Bannier vor 14 Jahren 0
Ich denke, es ist nicht außerhalb des Geltungsbereichs, weil ich denke, dass OP nicht sicher ist, wie er sein letztes Problem / seine endgültige Lösung erreichen kann: Entfernen Sie den gesamten Inhalt des Verzeichnisses. OP macht einfach die allgemeine "falsche" Sache, indem es bereits eine (schlechte) Lösung im Sinn hat und fragt, warum diese Lösung Probleme verursacht. Ein besserer Ansatz wäre: "Wie lösche ich alle Dateien in einem Verzeichnis, ohne das Verzeichnis selbst zu löschen?" Die Lösung von OP wird aufgrund der Funktionsweise von Globbing zu Problemen führen. akira vor 14 Jahren 1
@akira, um dieses Problem zu vermeiden, kann man [das Verzeichnis selbst einfach löschen und neu erstellen] (http://superuser.com/a/379788/35237) Tobias Kienzler vor 12 Jahren 0
@ TobiasKienzler: Du sprichst die falsche Person an. akira vor 12 Jahren 0
11
mpez0

Wenn Sie ein Verzeichnis und seinen gesamten Inhalt entfernen möchten, können Sie chdirdas übergeordnete Verzeichnis und rm -rfdas Verzeichnis nach Namen sortieren und die gesamte Globbing-Frage umgehen. Wenn Sie den Inhalt entfernen möchten, das Verzeichnis jedoch beibehalten, können Sie am besten alle Dateien entfernen und das Verzeichnis anschließend neu erstellen.

Es ist komplex, mit einem Glob zu kommen, der allen möglichen Verzeichniseinträgen entspricht. und ..; Es ist leicht, eine einfache Antwort (zB * .??*) zu finden, die in der Praxis fast immer funktioniert. Dies ist in Ordnung für die interaktive Verwendung, da es leicht zu merken ist und die Zeiten, in denen es nicht funktioniert, mit einem Post-RM erfasst werden können ls -a. Bei einem Skript ist es einfacher, alle Dateien zu entfernen und das leere Verzeichnis neu zu erstellen.

Das würde ich auch vorschlagen: das Verzeichnis wegwerfen und fertig akira vor 14 Jahren 1
Auch wenn es nicht die Antwort ist, ist es eine gute Idee. Johan vor 14 Jahren 0
10
Johan

Da ich denke, dass diese Frage mehr darüber ist, was * tut (und nicht rm), versuchen wir einen anderen Ansatz.


Wenn Sie sich nicht sicher sind, was der * macht, können Sie zunächst einen harmlosen Befehl wie Echo "testen". Bevor Sie dies ausführen, versuchen Sie zu erraten, was angezeigt wird, wenn Sie sie in Ihrem Heimatverzeichnis ausführen.

echo * echo .* 

Aber zuerst wollen wir einen Spielplatz schaffen, damit wir mit den Sternen spielen und sehen können, was uns erwartet.

mkdir ~/star_test/ cd ~/star_test/ >.file1 >file2 

Jetzt in diesem Verzeichnis haben wir folgendes:

cj@zap:~/star_test$ ls -1a . .. .file1 file2 

Beachten Sie nun, worauf sich der * mit dem Befehl echo erweitert:

cj@zap:~/star_test$ echo * file2 cj@zap:~/star_test$ echo .* . .. .file1 

Schauen wir uns also an, was mit dem Befehl rm passiert

cj@zap:~/star_test$ rm -rf * cj@zap:~/star_test$ ls -1a . .. .file1 

Wie Sie sehen, hat er nur die Datei2 entfernt, da * nur zu Datei2 erweitert wurde. Wenn Sie rm -rf. * Eingeben, entspricht dies dem Schreiben

rm -rf . .. .file1 

Und um ehrlich zu sein, das macht keinen Spaß;)

Ich hoffe, das klärt den * Teil Ihrer Frage.


Update: Wie Ankur Goel hervorhebt, gibt es in rm jedoch einen gewissen Schutz (eine Art ungewöhnlicher Befehl für Shellbefehle :)

Erstellen wir einen neuen Spielplatz:

cd ~/star_test/ mkdir -p test1/test2/test3 sudo chown root.root test1 cd test1/test2/test3/ >.file1 >file2 

Jetzt haben wir dies wieder, aber mit test1 gehört root zum Schutz, wenn rm anfängt, berserker zu werden.

cj@zap:~/star_test/test1/test2/test3$ ls -a . .. file2 .file1 cj@zap:~/star_test/test1/test2/test3$ echo .* . .. .file1 

Also lass uns alles entfernen:

cj@zap:~/star_test/test1/test2/test3$ rm -rf .* rm: cannot remove directory `.' rm: cannot remove directory `..' cj@zap:~/star_test/test1/test2/test3$ ls -a . .. file2 

Und es sieht so aus, als hätte sich rm nicht entfernt. und auch wenn wir es ihm gesagt haben !!!

Nach dieser langen Antwort stellt sich heraus, dass es sicher ist, alles in einem Verzeichnis mit diesem zu entfernen:

rm -rf * .* 

Aber ich würde dies mit Vorsicht verwenden, da ich nicht sicher bin, dass sich alle Implementierungen von rm so verhalten!

7
Ankur Goel

Ja. rm -rf löscht nur Dateien und Ordner im aktuellen Verzeichnis und steigt nicht in der Dateistruktur auf. rm folgt auch nicht den symbolischen Links und löscht die Dateien, auf die sie verweisen, so dass Sie nicht versehentlich andere Teile Ihres Dateisystems beschneiden.

1
tzot

Wenn Sie nicht wie bei mpez0 und rm -rfdiesem bestimmten Ordner eine Ebene nach oben verschieben möchten, können Sie alle Verzeichnisse / Dateien außer .und ..im aktuellen Ordner bearbeiten, indem Sie Folgendes tun:

rm -rf $(ls -A) 

Wenn eines der Verzeichnisse / Dateien eines der Zeichen in der Shell- IFSSondervariable enthält (z. B. Leerzeichen, Tabulator, Zeilenumbruch), können Sie natürlich zuerst den IFS ändern, den Befehl ausführen und dann IFS wiederherstellen.

0
Tobias Kienzler

A much easier way to empty an entire folder, also avoiding the "too many arguments" issues discussed in this answer, is to simply delete and recreate the directory itself. To make sure this works correctly when you are in a symlinked directory, use the following lines:

cd .. rm -rf $(readlink -f yourdir) #remove the directory, treat the case of a symlink # by using readlink, to recreate the linked-to directory mkdir $(readlink -f yourdir) # recreate the directory to have it empty cd yourdir 

(If you uses yourdir instead of $(readlink -f yourdir) you'd only replace the link while the original location remains full)

Dies kann zu Problemen führen, die auf den Inode des Ordners angewiesen sind, und Berechtigungen, atime / mtime / ctime / btime, erweiterte Attribute und Zugriffssteuerungslisten wegwerfen. Daniel Beck vor 12 Jahren 1
@ DanielBeck danke, gute Punkte. Ich frage mich zwar, was sich außer für Hardlinks (auf Verzeichnisse, die ohnehin dringend empfohlen werden) auf die Inode stützen würde? Aber Berechtigungen usw. sind wichtig. Also, im allgemeinsten Fall sollte _schalben_ wahrscheinlich 'xargs' verwenden ... Tobias Kienzler vor 12 Jahren 0
OS X enthält einen Mechanismus, mit dem Dateien und Ordner verschoben werden können und die Zuordnung erhalten bleibt. Am sichtbarsten im Menü * Letzte Dokumente öffnen *. AFAICT verwendet es Inodes, um dies intern zu erreichen. [Weitere Informationen] (http://superuser.com/questions/368288/how-did-xcode-osx-do-that-moved-an-xcode-project-to-another-location-xcode-aut/368297#368297 ). Es würde mich nicht wundern, wenn andere Systeme etwas Ähnliches implementieren würden, zB in APIs für GUI-Programme. Daniel Beck vor 12 Jahren 0