Gibt es einen Befehl zum Entfernen aller Dateien und Unterverzeichnisse in einem Verzeichnis, OHNE das Verzeichnis zu löschen?
Wenn ich zum Beispiel das Verzeichnis "dontDeleteMe" mit den Unterverzeichnissen "1", "2", "3" habe und jedes Unterverzeichnis einige Bilder enthält, wie kann ich die Unterverzeichnisse "1", "2" und "3" entfernen? und alle Dateien in ihnen, ohne das übergeordnete Verzeichnis "dontDeleteMe" zu entfernen?
quelle
find dontDeleteMe/* -print0 | xargs -0 rm -rv
Ich glaube in den meisten Fällen wird dies funktionieren, unabhängig von Leerzeichen und was nicht. Aber cd/tmp/
und mache ein Testverzeichnis und probiere es aus. :)rm -rf dontDeleteMe && mkdir dontDeleteMe
stellt nicht sicher, dass das Verzeichnis mit denselben Berechtigungen / Eigentümern neu erstellt wird. Verwenden Sie stattdessen eine der folgendenfind dontDeleteMe/ -mindepth 1 -delete
Varianten.Der einzige Grund
rm -r ./*
, warum dies nicht immer funktioniert, besteht darin, dass versteckte Dateien und / oder Ordner vorhanden sein können, die nicht mit übereinstimmen*
.Stellen Sie zu diesem Zweck
bash
eine Option bereit,*
mit der Sie alle Elemente, auch versteckte Objekte, abgleichen können:Es kann nützlich
dotglob
sein, den Standardzustand (nicht gesetzt) wiederherzustellen, wenn Sie weiterhin die Shell verwenden, in der Sie die obigen Befehle ausgeführt haben:quelle
Öffnen Sie das Terminal ( Ctrl+ Alt+ T) und geben Sie Folgendes ein:
Dadurch werden alle Dateien und Verzeichnisse innerhalb übereinstimmen
somedir
und ihre (Gross-) Kinder „versteckt“ dot - Dateien , einschließlich , aber ohnesomedir
selbst wegen-mindepth 1
, dann-delete
sie.quelle
Verwenden Sie die
xdev
Option, um Dateien nur innerhalb der Gerätegrenze zu löschen.quelle
-delete
. Es impliziert-depth
und ist leichter zu merken als-depth -exec rm -Rf {} \;
So löschen Sie (im Terminal) alle Dateien und Unterverzeichnisse mit Ausnahme des Basisverzeichnisses "dontdelete":
quelle
Sie können
find
mit der-delete
Flagge verwenden:find dontDeleteMe/* -delete
Das
/*
ist wichtig, da es sagtfind
, dass nur IN dem Ordner mit dem Namen "dontDeleteMe" gesucht werden soll.Stellen Sie außerdem sicher, dass sich das
-delete
Flag am Ende desfind
Befehls befindet.quelle
dotglob
. Andernfalls-mindepth 1
scheint die Verwendung der Flag-Option die einzige Möglichkeit zu sein, diese Funktion zu nutzen.Was sagt:
Entfernen Sie alle Dateien, die mit beginnen. in "Verzeichnis" und allen anderen Dateien auch.
Wie von Neftas freundlicherweise erwähnt, ist diese Lösung nicht sicher!
Sicherere Lösung ist:
quelle
.
und einschließen..
. Dies kann durch Änderung vermieden werden ,{.*}
um{.??*}
, aber dann löschen Sie nicht versteckte Dateien mit nur einem Zeichen, wie zum Beispiel.a
.Ich bin mir nicht sicher warum das so komplex ist, hilf mir wenn ich falsch liege
Das ist es
quelle
Es gibt eine noch einfachere Antwort:
cd dontDeleteMe
rm -rf *
Grundlegende Vorlesungszeit für die Systemadministration: Achten Sie darauf, wo Sie sich befinden, wenn Sie solche Kehrbefehle verwenden.
Das kann ich gar nicht genug sagen. Ich musste eine Kiste zurückholen, weil jemand nicht aufgepasst und
rm -rf *
in / getippt hat .* nix geht davon aus, dass Sie wissen, was Sie tun, wenn Sie als root angemeldet sind oder als root angemeldet sind. Stellen Sie also sicher, dass Sie wissen, was Sie tun, bevor Sie es tun.
Eine Alternative, die sicherstellt, dass Ihr "cd" -Befehl funktioniert, bevor Sie das "rm" ausgeben, ist die Verwendung
quelle
cd dontDeleteMe && rm -rf *
&&
Operator verkettet die Befehle nicht nur miteinander. Es erfordert, dass jeder Befehl erfolgreich ist, bevor der nächste ausgeführt wird. Wenn dercd
Befehl aus irgendeinem Grund fehlschlägt (Verzeichnis nicht vorhanden, Berechtigungen usw.), wird derrm
Befehl nicht ausgeführt. Ich würde das sicherer nennen.quelle
rm -rf *
sowieso am Ende rennst.löscht das aktuelle Arbeitsverzeichnis
quelle