Wie entferne ich alle Dateien und Unterverzeichnisse in einem Verzeichnis, OHNE das Verzeichnis in bash zu löschen?

53

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?

user784637
quelle

Antworten:

66

Um alles in einem Verzeichnis zu entfernen, ohne das Verzeichnis zu entfernen, geben Sie Folgendes ein:

rm -rfv dontDeleteMe/*

Bitte beachten Sie, dass das /*Teil sehr wichtig ist. Wenn Sie ein Leerzeichen vor das setzen *, werden alle Ihre Dateien in Ihrem aktuellen Verzeichnis gelöscht.

Auch sehr vorsichtig sein , spielt mit rm, -rund *alle in dem gleichen Befehl. Sie können eine katastrophale Kombination sein.

Update: Okay, ich habe festgestellt, dass wenn Sie versteckte / dot-Dateien haben [Dateinamen mit Punkten am Anfang, ex .hidden], diese Dateien intakt bleiben.

Die einfachste Lösung für die ursprüngliche Frage lautet also: rm -rfv dontDeleteMe && mkdir dontDeleteMe

Ein anderer wäre zu verwenden finds -execOption oder Rohr xargs(unten):

find dontDeleteMe/* -print0 | xargs -0 rm -rv

Matt
quelle
Können Sie ein Beispiel für die Verwendung von xargs geben? Was ist Xargs?
Justingrif
@justingrif: 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. :)
Matt
Oh, und aus der Manpage: "xargs - Kommandozeilen von der Standardeingabe erstellen und ausführen"
Matt
5
Das erneute Erstellen eines Verzeichnisses entspricht nicht dem Löschen seines Inhalts. zB umask Verzeichnisberechtigungsunterschiede, Eigentümerunterschiede, etc ... Die Antwort von enzotib würde die Probleme mit Ihrer ursprünglichen Syntax lösen
3
Dies ist keine gute Antwort. Die Verwendung von * ist gefährlich und funktioniert nicht bei Punktedateien ohne "dotglob" (siehe unten). rm -rf dontDeleteMe && mkdir dontDeleteMestellt nicht sicher, dass das Verzeichnis mit denselben Berechtigungen / Eigentümern neu erstellt wird. Verwenden Sie stattdessen eine der folgenden find dontDeleteMe/ -mindepth 1 -deleteVarianten.
Nils Toedtmann,
27

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 basheine Option bereit, *mit der Sie alle Elemente, auch versteckte Objekte, abgleichen können:

cd dont-delete-me
shopt -s dotglob
rm -r ./*

Es kann nützlich dotglobsein, den Standardzustand (nicht gesetzt) ​​wiederherzustellen, wenn Sie weiterhin die Shell verwenden, in der Sie die obigen Befehle ausgeführt haben:

shopt -u dotglob 
Enzotib
quelle
Es kann auch nicht funktionieren, wenn Sie eine große Anzahl von Dateien haben
S ..
23

Öffnen Sie das Terminal ( Ctrl+ Alt+ T) und geben Sie Folgendes ein:

find somedir -mindepth 1 -delete

Dadurch werden alle Dateien und Verzeichnisse innerhalb übereinstimmen somedirund ihre (Gross-) Kinder „versteckt“ dot - Dateien , einschließlich , aber ohne somedirselbst wegen -mindepth 1, dann -deletesie.

guciek
quelle
Willkommen bei AskUbuntu! Während Ihre Antwort möglicherweise dem Originalposter helfen könnte, macht der Mangel an Informationen, die erklären, was dies für ihn tun würde, Ihre Antwort unvollständig.
Oyibo
3
Fehlt eine Erklärung, aber immer noch die beste Antwort. Funktioniert auch unter OSX (außer natürlich beim Öffnen des Terminals).
Noamtm
6
find /dontDeleteMe/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;

Verwenden Sie die xdevOption, um Dateien nur innerhalb der Gerätegrenze zu löschen.

Sergey
quelle
GNU hat gefunden -delete. Es impliziert -depthund ist leichter zu merken als-depth -exec rm -Rf {} \;
Nils Toedtmann
4

So löschen Sie (im Terminal) alle Dateien und Unterverzeichnisse mit Ausnahme des Basisverzeichnisses "dontdelete":

rm -rf dontdelete/*
kyleN
quelle
Dadurch werden keine versteckten Dateien gelöscht, sodass "alle Dateien" möglicherweise zu fett dargestellt werden.
Stefan van den Akker
4

Sie können findmit der -deleteFlagge verwenden:

find dontDeleteMe/* -delete

Das /*ist wichtig, da es sagt find, dass nur IN dem Ordner mit dem Namen "dontDeleteMe" gesucht werden soll.

Stellen Sie außerdem sicher, dass sich das -deleteFlag am Ende des findBefehls befindet.

SaultDon
quelle
1
Diese Lösung löscht keine versteckten Dateien, es sei denn, Sie aktivieren dotglob. Andernfalls -mindepth 1scheint die Verwendung der Flag-Option die einzige Möglichkeit zu sein, diese Funktion zu nutzen.
Stefan van den Akker
3
rm -rf  directory/{.*,/*}

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:

 rm -rf directory/!(.|..)
Tebe
quelle
Dieser Befehl kann möglicherweise gefährlich sein, da Sie auch Verzeichnisse .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.
Stefan van den Akker
Was ist damit? RM-RF-Verzeichnis /! (. | ..)
Tebe
Das sieht nach einer viel besseren Lösung aus, als ich es mir ausgedacht habe. Darf ich vorschlagen, dass Sie Ihre Antwort bearbeiten?
Stefan van den Akker
Vorschlag angenommen)
Tebe
1

Ich bin mir nicht sicher warum das so komplex ist, hilf mir wenn ich falsch liege

cd DoNotDeleteDir #<- this is just to make sure we are inside
find . | xargs rm -rf

Das ist es

user353305
quelle
Dies hat den kleinen Fehler, dass versucht wird, auch das aktuelle Verzeichnis zu löschen, was natürlich nicht funktioniert, da es immer noch als Arbeitsverzeichnis der aufrufenden Shell verwendet wird.
David Foerster
1

Es gibt eine noch einfachere Antwort:

  1. cd dontDeleteMe

  2. 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

cd dontDeleteMe && rm -rf *
user30619
quelle
6
Dies ist ein gefährlicher Vorschlag. Was Sie wollen, ist: cd dontDeleteMe && rm -rf *
Izkata
@Izkata Oder stellen Sie sicher, dass der CD-Vorgang erfolgreich war, bevor Sie den Befehl rm absetzen.
Eliah Kagan
1
@EliahKagan Genau das macht mein Code-Snippet ...
Izkata
Eigentlich ist es nicht gefährlicher oder gefährlicher, als Sie vermuten. Alles, was Sie tun müssen, ist, die beiden Befehle miteinander zu verketten, damit sie gleichzeitig ausgeführt werden. Wenn überhaupt, ist meine Methode tatsächlich SICHERER, da Sie anhalten und nachsehen müssen, bevor Sie rm -rf * ausführen. Eine Pause zur Überprüfung ist immer besser.
user30619
5
@ user30619 Der &&Operator verkettet die Befehle nicht nur miteinander. Es erfordert, dass jeder Befehl erfolgreich ist, bevor der nächste ausgeführt wird. Wenn der cdBefehl aus irgendeinem Grund fehlschlägt (Verzeichnis nicht vorhanden, Berechtigungen usw.), wird der rmBefehl nicht ausgeführt. Ich würde das sicherer nennen.
ean5533
0
  1. Das Einfachste für mich - ein Windows-Experte, aber ein Ubuntu-Neuling
  2. Klicken Sie im Launcher auf das Symbol Dateien
  3. Navigieren Sie zu dem Verzeichnis, in dem sich die zu löschenden Dateien und Ordner befinden
  4. Klicken Sie mit der rechten Maustaste in einen leeren Bereich des Fensters neben den Dateien und klicken Sie auf "In Terminal öffnen" - lassen Sie das Fenster "Dateien" geöffnet
  5. Ein Terminalfenster wird geöffnet und auf den von Ihnen gefundenen Ordner "eingestellt"
  6. Sie können "dir" eingeben (ohne Anführungszeichen, wenn ich "type" sage) und die Eingabetaste drücken, damit das Terminal eine Liste der Dateien und Ordner anzeigt - nur um zu beweisen, dass Sie sich im richtigen Ordner befinden
  7. Geben Sie "rm -rf *" ein und drücken Sie die Eingabetaste
  8. Abhängig von der Größe der zu löschenden Ordner / Dateien wird das System angehalten
  9. Wenn die Eingabeaufforderung des Terminals zurückkehrt, wird im zuvor geöffneten Fenster "Dateien" die Meldung "Ordner ist leer" angezeigt.
  10. Ich hatte Erfolg mit dieser Methode und es gab mir Trost, die Dateien / Ordner sowohl im Dateifenster als auch aufgrund des Befehls Dir im Terminalfenster zu sehen
  11. Es beruhigte mich auch, dass im Fenster "Dateien" der Ordner jetzt leer war - insbesondere, weil ich diese Dateien nach dem Papierkorb durchsucht hatte, in dem sie sich befanden
  12. Vielen Dank an alle anderen, die Antworten eingereicht haben - es war sehr informativ
William Saxon
quelle
Das scheint ziemlich verworren zu sein - zumal du rm -rf *sowieso am Ende rennst.
David Foerster
0
rm -rf ${PWD}/*

löscht das aktuelle Arbeitsverzeichnis

Nick Mitchell
quelle