Wie entfernt man unter Unix alles im aktuellen Verzeichnis und darunter?

Antworten:

166

Übe sicheres Rechnen. Gehen Sie einfach eine Ebene in der Hierarchie nach oben und verwenden Sie keinen Platzhalterausdruck:

cd ..; rm -rf -- <dir-to-remove>

Die beiden Striche zeigen an --, rmdass dies <dir-to-remove>keine Befehlszeilenoption ist, selbst wenn sie mit einem Bindestrich beginnt.

Tvanfosson
quelle
8
Warum ist das sicherer?
Yen
34
Weil Sie speziell mit einem benannten Verzeichnis übereinstimmen und daher weniger wahrscheinlich etwas löschen, das Sie nicht löschen möchten.
Tvanfosson
5
Wahr. Ich konnte mir das ziemlich leicht vorstellen.
Yen
26
löscht es nicht auch das Verzeichnis selbst? Sie müssen danach mkdir <dir-to-remove> ausführen. Aber dann wird jeder Hardlink, der auf dieses Verzeichnis verweist, danach ein bestimmtes Verzeichnis sein.
Johannes Schaub - litb
5
@ Yen, wenn Sie verwenden, können rm ./Sie versehentlich eingeben, rm . /was eine Katastrophe sein könnte.
Irfandar
44

Löscht alle Dateien / Verzeichnisse unter dem aktuellen.

find -mindepth 1 -delete

Wenn Sie dasselbe mit einem anderen Verzeichnis tun möchten, dessen Namen Sie haben, können Sie diesen einfach benennen

find <name-of-directory> -mindepth 1 -delete

Wenn Sie nicht nur die Unterverzeichnisse und Dateien entfernen möchten, sondern auch das Verzeichnis selbst, lassen Sie es weg -mindepth 1. Machen Sie es ohne -delete, um eine Liste der Dinge zu erhalten, die entfernt werden.

Johannes Schaub - litb
quelle
Ich musste alle Dateien in Unterverzeichnissen löschen, wollte aber die Unterverzeichnisse selbst nicht löschen. find <name-of-direcotry> -mindepth 2 -delete hat super funktioniert!
Tim Dearborn
Sie benötigen, -mindepth 1wenn Sie ein Verzeichnis angeben ( find <name-of-directory> -mindepth 1 -delete). Andernfalls hat Johannes Recht, das aktuelle Arbeitsverzeichnis wird nicht gelöscht (bei Verwendung find -delete).
Weboide
IMO, dies ist die beste Antwort, insbesondere in Skripten.
Zauberlösungen
1
Ich habe es versucht: find -mindepth 1 -deleteaber ich habe illegal option -- mes bekommen, aber es hat großartig funktioniert, als ich die Mindepth-Option entfernt habe find . -delete
Sharon
41

Was ich immer mache, ist Typ

rm -rf *

und drücken Sie dann ESC- * und bash die * auf eine explizite Liste von Dateien und Verzeichnisse im aktuellen Arbeitsverzeichnis erweitern.

Die Vorteile sind:

  • Ich kann die Liste der zu löschenden Dateien überprüfen, bevor ich die EINGABETASTE drücke.
  • Der Befehlsverlauf enthält nicht "rm -rf *" mit intaktem Platzhalter, der dann möglicherweise versehentlich zur falschen Zeit am falschen Ort wiederverwendet wird. Stattdessen enthält der Befehlsverlauf die tatsächlichen Dateinamen.
  • Es hat sich auch als nützlich erwiesen, ein- oder zweimal zu antworten: "Moment mal ... welche Dateien habe ich gerade gelöscht?". Die Dateinamen werden im Terminal-Scrollback-Puffer oder im Befehlsverlauf angezeigt.

Tatsächlich gefällt mir das so gut, dass ich es mit dieser Zeile in .bashrc zum Standardverhalten für TAB gemacht habe:

bind TAB:insert-completions
Ville Laurikari
quelle
Fehlt --diese Antwort? Dieser Ansatz ist insgesamt fantastisch, muss ich sagen.
Ben Voigt
Besser geht es mit sudo
Abbas Torabi
22

Verwenden

rm -rf *

Update: Das .steht für das aktuelle Verzeichnis, aber wir können dieses nicht verwenden. Der Befehl scheint explizite Überprüfungen für .und zu haben ... Verwenden Sie stattdessen den Platzhalter Globbing. Dies kann jedoch riskant sein.

Eine sicherere Version IMO ist zu verwenden:

rm -ri * 

(Dies fordert Sie zur Bestätigung auf, bevor Sie jede Datei / jedes Verzeichnis löschen.)

dirkgently
quelle
13
"Kann riskant sein" ist wunderbar lakonisch.
5
Wenn ich solche Dinge mache, habe ich ein schnelles ls -r gefunden. Zuerst können Sie sehen, was Sie löschen möchten. Nützlich, um eine schnelle Vorstellung davon zu geben, dass Sie nicht die gesamte Festplatte löschen werden ...
Rich Bradshaw
2
Warum ist es riskanter als rm -rf <Unterverzeichnisname>?
Yen
2
@ Yen - denn wenn Sie es am falschen Ort tun, können Sie katastrophale Ergebnisse erzielen. Die Verwendung eines bestimmten Namens an der falschen Stelle kann nur dann schief gehen, wenn dort dasselbe Unterverzeichnis vorhanden ist.
Tvanfosson
1
Sie können den Elternteil unmöglich löschen, während Sie im Kind wohnen.
Dirkgently
6

Es ist richtig, dass rm –rf .alles in der aktuellen direkt entfernt wird, einschließlich aller Unterverzeichnisse und deren Inhalt. Der einzelne Punkt ( .) bedeutet das aktuelle Verzeichnis. Seien Sie vorsichtig, rm -rf ..da der doppelte Punkt ( ..) das vorherige Verzeichnis bedeutet.

Wenn Sie wie ich sind und mehrere Terminalfenster gleichzeitig geöffnet haben, sollten Sie auf Nummer sicher gehen und rm -ir .die Befehlsargumente verwenden, um zu verstehen, warum.

Wenn Sie sich die rmManpage für Befehle ( man rmunter den meisten Unix-Versionen) ansehen, stellen Sie zunächst fest, dass dies –rbedeutet, dass der Inhalt von Verzeichnissen rekursiv entfernt wird. Wenn Sie dies rm -r .alleine tun, wird alles im aktuellen Verzeichnis und alles darunter gelöscht.

Im rm –rf .hinzugefügten -f bedeutet "nicht vorhandene Dateien ignorieren, niemals auffordern". Dieser Befehl löscht alle Dateien und Verzeichnisse im aktuellen Verzeichnis und fordert Sie niemals auf, zu bestätigen, dass Sie dies wirklich tun möchten. -fDies ist besonders gefährlich, wenn Sie den Befehl unter einem Berechtigungsbenutzer ausführen, da Sie den Inhalt eines beliebigen Verzeichnisses löschen können, ohne die Möglichkeit zu haben, sicherzustellen, dass dies wirklich das ist, was Sie möchten.

Auf der otherhand, in rm -ri .dem -iDASS ersetzt die -fMittel „prompt vor jeder Entnahme“. Dies bedeutet, dass Sie die Möglichkeit haben, "oups! Das ist nicht das, was ich will" zu sagen, bevor rm alle Ihre Dateien glücklich löscht.

In meinen frühen Sysadmin-Tagen habe ich rm -rf /ein System erstellt, während ich mit vollen Berechtigungen (root) angemeldet war. Das Ergebnis war, dass zwei Tage vergangen waren, um das System aus Backups wiederherzustellen. Deshalb beschäftige ich mich jetzt rm -rijetzt.

Pierre-Luc Simard
quelle
6

Wie wäre es mit:

rm -rf "$(pwd -P)"/* 

quelle
27
jQuery ist so mächtig.
Pawel
5
rm  -rf * 

Tu es nicht! Es ist gefährlich! Stellen Sie sicher, dass Sie im richtigen Verzeichnis sind!

nkassis
quelle
4

Stellen Sie sicher , dass Sie sich im richtigen Verzeichnis befinden

rm -rf *
digitaljoel
quelle
2
Dadurch werden keine Dateien oder Unterverzeichnisse gelöscht, deren Name mit einem Punkt beginnt.
1
wahr. in meinen Tests auch nicht rm -rf. tvanfosson hat die beste Lösung IMO mit seiner "cd ..; rm -rf <dir-to-remove>"
digitaljoel
2

Diese einfachste sichere und allgemeine Lösung ist wahrscheinlich:

find -mindepth 1 -maxdepth 1 -print0 | xargs -0 rm -rf
devnev
quelle
1

Ich glaube, diese Antwort ist besser:

/unix/12593/how-to-remove-all-the-files-in-a-directory

Wenn Ihr Verzeichnis der obersten Ebene aufgerufen wird images, führen Sie es aus rm -r images/*. Dies verwendet den Shell-Glob-Operator *, um rm -rfür jede Datei oder jedes Verzeichnis in Bildern ausgeführt zu werden.

Im Grunde geht man eine Ebene höher und sagt dann, alles im X-Verzeichnis löschen. Auf diese Weise legen Sie immer noch fest, in welchem ​​Ordner der Inhalt gelöscht werden soll. Dies ist sicherer, als nur "Alles hier löschen" zu sagen, während der ursprüngliche Ordner erhalten bleibt (was Sie manchmal möchten, weil Sie nicht erlaubt sind oder einfach nicht wollen um die vorhandenen Berechtigungen des Ordners zu ändern)

Francisco Noriega
quelle