Frage Wie entferne ich alle Dateien aus einem Verzeichnis?


Der nächste, den ich bekommen habe, ist

# rm /path/to/directory/*.*

aber das funktioniert nicht für Dateien, die keine Erweiterung haben ...


205
2017-09-06 07:58


Ursprung




Antworten:


Linux verwendet keine Erweiterungen. Es liegt am Ersteller der Datei, zu entscheiden, ob der Name eine Erweiterung haben soll. Linux untersucht das erste Byte, um herauszufinden, um welche Art von Datei es sich handelt.

Um alles in einem Verzeichnis zu entfernen, benutze:

rm /path/to/directory/*

Du kannst den ... benutzen -r Option, zum Beispiel:

rm -r /path/to/directory/* 

um auch alle Unterverzeichnisse (mit ihrem gesamten Inhalt) innerhalb des Verzeichnisses zu entfernen, aus dem Sie den Inhalt entfernen. Andernfalls wird ein Fehler angezeigt, der Sie darüber informiert, dass das Verzeichnis nicht entfernt wird.


235
2017-09-06 08:06



Wenn Sie auch versteckte Dateien löschen möchten, führen Sie diese aus shopt -s dotglob vor dem Laufen rm (...) - danjjl
Die Mittel all files ;) *.* bedeutet alle Dateien, die ein enthalten . irgendwo im Namen - Rinzwind
@Rinzwind, genauer gesagt, der Stern bedeutet "null oder mehr irgendeines Zeichens". Damit *a* bedeutet null oder mehr Zeichen, gefolgt von a gefolgt von null oder mehr Zeichen. Es würde die Dateinamen übereinstimmen happy, apple, a oder la. - DisgruntledGoat
@ user784637 Sie sind zu leicht beeindruckt - barlop
Hier ist der Befehl, den Sie wollen: rm - * - anon58192932


  • Zu entfernen der Ordner mit all seinen Inhalten (einschließlich aller Innenordner):

    rm -rf /path/to/directory
    
  • Um alle zu entfernen Inhalt des Ordners(einschließlich aller Innenordner) aber nicht der Ordner selbst:

    rm -rf /path/to/directory/*
    

    oder

    rm -rf /path/to/directory/{*,.*}
    

    wenn Sie sicherstellen möchten, dass auch versteckte Dateien / Verzeichnisse entfernt werden.

  • So entfernen Sie alle "Dateien" aus einem Ordner (nicht Entfernen von internen Ordnern):

    rm -f /path/to/directory/{*,.*}
    

Woher:

  • rm - steht für "Löschen"
  • -f - steht für "Macht"Dies ist hilfreich, wenn Sie nicht gefragt / aufgefordert werden möchten, wenn Sie beispielsweise ein Archiv entfernen möchten.
  • -r - steht für "rekursiv"Das bedeutet, dass Sie jeden Ordner rekursiv durchsuchen und alles entfernen möchten.

126
2017-09-07 17:26



Ich fand, dass dies die umfassendere und hilfreichere Antwort war, über die Antwort hinaus, die als Akzeptiert markiert war. - inspirednz
rm -rf /path/to/directory/* entfernt keine versteckte Datei im Ordner, z. .htaccess. Könnte sein rm -rf /path/to/directory/.? Hab es nicht probiert. - Mark Berry
@MarkBerry rm -rf /pfad/zu/verzeichnis/.* - Lilian A. Moraru
@ LilianA.Moraru, habe ich heute einige Tests gemacht. rm -rf /path/to/directory/.* Löscht nur die versteckten Dateien im angegebenen Verzeichnis. Sehen Sie sich den @ danjjl-Kommentar zu @ Rinzwinds Antwort an, um auch versteckte Dateien zu löschen: run shopt -s dotglob vor dem Laufen rm -rf /path/to/directory/*. - Mark Berry
VORSICHT: rm -rf /path/to/directory/.* auf meinem System verursachte Löschen von Elementen in /path/to. Glücklicherweise hatte ich gerade meine gesamten Daten auf einer separaten Festplatte gesichert. Unnötig zu sagen, geben Sie den Befehl NICHT aus rm -rf /path/to/directory/.* es sei denn, Sie haben Ihren gesamten Computer an einem separaten / sicheren Ort gesichert! - lawlist


Um alle Dateien im Verzeichnis (einschließlich versteckter Dateien und Unterverzeichnisse) zu entfernen, führen Sie Folgendes aus:

rm -rf /path/to/directory/{*,.*}

30
2017-11-23 09:38



Dies sollte die schöne akzeptierte Antwort sein. Vielen Dank! - Nam G VU
Passt dieser Glob nicht zu "." und auch? - hertzsprung
@hertzsprung - es tut, und es wird Ihnen eine Warnung geben, dass es nicht löschen kann ./ und ../, aber es wird immer noch die versteckten Dateien löschen. - Ryan Wheale
Dies funktioniert nicht auf der Mac-Konsole, versteckte Dateien sind immer noch mit dieser Befehlszeile vorhanden. - agapitocandemor


Wenn Sie nur Dateien im Verzeichnis / path / to / löschen möchten, können Sie das tun

find /path/to/directory -type f -print0| xargs -0 rm 

oder

find /path/to/directory -type f -exec rm '{}' \;

Sie können Lasten mit tun findDer Vorteil besteht darin, dass Sie auflisten können, was gefunden wird, ohne es zu verschicken rm So können Sie sehen, was gelöscht wird, bevor Sie beginnen.


8
2017-09-06 12:13



GNU find Als ein -delete Prädikat. Wenn Sie noch verwenden möchten -exec, ersetzen \; mit + werde sammeln rm ruft zusammen und steigert die Effizienz. - enzotib
große Anzahl von Dateien mit '+' wird Probleme verursachen, da die Liste zu groß ist, genau wie rm -f *. und beim Entfernen großer Mengen von Dateien aus dem gleichen Ordner (sprechen in Millons) sind beide nicht gut :) Am Ende kam C ++ und entfernte Dateien in der Reihenfolge der Inodes in Verzeichnisbaum. - Osis
Sie sollten wirklich ein - nach dem RM hinzufügen. Ohne das, wenn Sie einen Dateinamen haben -rf oder ähnliches wird als Argumente für rm interpretiert. z.B. xargs -0 rm - oder -exec rm - {} \; - Richm
Sie können auch das Argument -n für XARGs angeben. Dadurch werden die rm-Befehle auf eine maximale Anzahl von Argumenten aufgeteilt, d. H. "Xargs -n 100 -0 rm -" entfernt Dateien in Chunks von 100. - Richm
Sie können -maxdepth 1 auch hinzufügen, um sicherzustellen, dass find keine Dateien aus Unterverzeichnissen zurückgibt. d.h. find / path / to / directory-maxdepth 1 -Typ f - Richm


Wenn Sie auch alle Unterverzeichnisse und das Verzeichnis selbst entfernen möchten, können Sie verwenden rm -rf /path/to/directory. Überprüfen Sie jedoch immer Ihre Zeile, bevor Sie auf Return drücken. rm -rf kann auch viel Havard verursachen, z.B. wenn Sie versehentlich ein Leerzeichen nach dem ersten Schrägstrich einfügen, während Sie über Superuser-Berechtigungen verfügen ...


6
2017-09-07 08:51





Um alle Dateien und Verzeichnisse (einschließlich der versteckt one) in einem Verzeichnis können Sie Folgendes versuchen:

  • Löschen Sie den Ordner und erstellen Sie ihn erneut

    rm -rf dir_name && mkdir dir_name
    
  • benutzen find

    find dir_name -mindepth 1 -delete  
    

Hier spezifizieren wir -mindepth 1 um das Verzeichnis dir_name selbst auszuschließen.
Sehen Sie sich den folgenden Link an:
https://unix.stackexchange.com/questions/12593/how-to-remove-all-the-files-in-a-verzeichnis


5
2017-11-27 16:05



Danke für deinen Rat und ich habe mehr Erklärungen für die Links hinzugefügt. - zeekvfu
Seien Sie vorsichtig, da das Löschen und erneute Erstellen des Ordners zu unterschiedlichen / falschen Berechtigungen für diesen Ordner führen kann! - einjohn


Sie können cd in das Verzeichnis und dann den Befehl ausführen rm *.* genau wie in DOS, wenn du dich erinnerst.


1
2018-05-01 00:59



DOS ist DEL für Dateien und RMDIR für geleerte Verzeichnisse - und versteckte und Systemdateien müssen diese ATTRIB-Attribute zuerst entfernt haben. Nicht annähernd so einfach;) - Eric


Um das aktuelle Verzeichnis zu löschen, könnten Sie beispielsweise verwenden rm -d ./*

-d sagt, dass auch Verzeichnisse gelöscht werden sollen.


0
2017-08-29 07:17





Da diese Frage bei Google immer ganz oben steht, wenn ich selbst danach suche:

Die anderen Antworten leiden unter verschiedenen Problemen:

  1. Einige von ihnen beinhalten . und .. Das ist laut, verwirrend und nervig.

  2. Einige von ihnen vergessen versteckte Dateien (Dateien, die mit einem Punkt beginnen).

  3. Sie löschen nicht in einer korrekten (tiefsten-ersten) Reihenfolge, um das Löschen von Verzeichnissen zu erlauben.

  4. Sie fallen in andere (gemountete) Dateisysteme ab, was oft unerwünscht ist.

  5. Sie sind schwer zu erweitern mit zusätzlichen Parametern (mehr dazu unten).

Um also alle Dateien UND Ordner in einem Verzeichnis RECURSIVELY zu löschen, gehen Sie folgendermaßen vor:

find "${DIR}" -xdev -mindepth 1 -printf "%d\t%y\t%p\0" | sort -z -r -n | cut -z -f3- | xargs -0 -r -- rm -d --

Beachten Sie, dass ich ein hinzugefügt habe -xdev Argument, um das Abtauchen in Reittiere zu verhindern (wie /proc etc.).

Warum nicht -depth oder -delete?

Obwohl die Leute mich ständig dafür ablehnen, haben diese Methoden einen Nachteil: Sie scheinen nicht erweiterbar genug zu sein -pruneein Unterverzeichnis (ohne weitere Probleme). Im Gegensatz zu dieser Methode könnten Sie einfügen

-not \( -path "${DIR}/subdir" -prune \)

Vor dem -mindepth auszuschließendes Argument subdir von seinem Inhalt gelöscht werden.


-1
2018-05-21 00:54



Und für die Reihenfolge erster Ordnung gibt es eine -depth Flagge ein find dafür. - Sergiy Kolodyazhnyy
Äh ... warum nicht einfach benutzen -delete mit find? -delete ist die Tiefe zuerst. Sie nehmen bereits nicht POSIX an find mit dem -printf, also könntest du es genauso gut benutzen -delete oder -depth -print0 | xargs -0 rm - muru
@muru: Weil ich es nicht besser wusste ... ich werde es ändern. - Mehrdad
@muru: Eigentlich scheint deine Methode nicht mit zu funktionieren -not \( -path "$DIR/subdir" \)... aber meins tut? Warum? - Mehrdad
@Mehrdad was soll das machen? - muru