Wie entferne ich alle Dateien aus einem Verzeichnis?

289

Der nächste, den ich bekommen habe, ist

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

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

user784637
quelle

Antworten:

340

Linux verwendet keine Erweiterungen. Es ist Sache des Erstellers der Datei, zu entscheiden, ob der Name eine Erweiterung haben soll. Linux untersucht das 1. Byte, um herauszufinden, um welche Art von Datei es sich handelt.

Um alles in einem Verzeichnis zu entfernen, verwenden Sie:

rm /path/to/directory/*

Sie können die -rOption zum Beispiel verwenden:

rm -r /path/to/directory/*

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

Rinzwind
quelle
13
Wenn Sie auch versteckte Dateien löschen möchten, führen Sie diese shopt -s dotglobvor dem Ausführen ausrm (...)
danjjl
7
Das * bedeutet all files;) *.*bedeutet alle Dateien, die .irgendwo im Namen enthalten
Rinzwind
10
@Rinzwind, genauer gesagt, der Stern bedeutet "Null oder mehr eines beliebigen Zeichens". Bedeutet *a*also null oder mehr Zeichen, agefolgt von null oder mehr Zeichen. Es würde die Dateinamen übereinstimmen happy, apple, aoder la.
DisgruntledGoat
7
@ user784637 Sie sind zu leicht beeindruckt
Barlop
1
Hier ist der gewünschte Befehl: rm - *
anon58192932
168
  • So entfernen Sie den Ordner mit seinem gesamten Inhalt ( einschließlich aller internen Ordner ):

    rm -rf /path/to/directory
    
  • So entfernen Sie den gesamten Inhalt des Ordners ( einschließlich aller internen Ordner ), jedoch nicht den 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 ( ohne interne Ordner zu entfernen ):

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


  • Warnung : Wenn Sie Leerzeichen in Ihrem Pfad haben, stellen Sie sicher, dass Sie immer Anführungszeichen verwenden.

    rm -rf /path/to the/directory/*
    

    entspricht 2 getrennten rm -rfAufrufen:

    rm -rf /path/to
    rm -rf the/directory/*
    

    Um dieses Problem zu vermeiden, können Sie 'einfache Anführungszeichen '( erweitert keine Shell-Variablen) oder "doppelte Anführungszeichen "( erweitert Shell-Variablen) verwenden:

    rm -rf "/path/to the/directory/"*
    


Wo:

  • rm- steht für " entfernen "
  • -f- steht für " force ", was hilfreich ist, wenn Sie nicht gefragt werden möchten, ob Sie beispielsweise ein Archiv entfernen möchten.
  • -r- steht für " rekursiv ", was bedeutet, dass Sie jeden Ordner rekursiv durchgehen und alles entfernen möchten.
Lilian A. Moraru
quelle
8
Ich fand diese Antwort umfassender und hilfreicher als die Antwort, die als "Akzeptiert" markiert war.
Inspirednz
2
rm -rf /path/to/directory/*entfernt keine versteckte Datei im Ordner zB .htaccess. Vielleicht rm -rf /path/to/directory/.? Habe es nicht ausprobiert.
Mark Berry
@MarkBerry rm -rf /path/to/directory/.*
Lilian A. Moraru
@ LilianA.Moraru, ich habe heute ein paar Tests gemacht. rm -rf /path/to/directory/.*löscht nur die versteckten Dateien im angegebenen Verzeichnis. Wenn Sie sich den Kommentar von @ danjjl zur Antwort von @ Rinzwind ansehen, um auch versteckte Dateien zu löschen, führen Sie ihn aus, shopt -s dotglobbevor Sie ihn ausführen rm -rf /path/to/directory/*.
Mark Berry
VORSICHT: rm -rf /path/to/directory/.*Auf meinem System wurden die Elemente in gelöscht /path/to. Zum Glück hatte ich gerade meine gesamten Daten auf einer separaten Festplatte gesichert. Der Befehl rm -rf /path/to/directory/.*darf NICHT ausgegeben werden, es sei denn, Sie haben Ihren gesamten Computer an einem separaten / sicheren Ort gesichert!
Gesetzesliste
43

So entfernen Sie alle Dateien im Verzeichnis (einschließlich versteckter Dateien und Unterverzeichnisse):

rm -rf /path/to/directory/{*,.*}
Leonid V. Fedorenchik
quelle
1
Dies sollte die schön akzeptierte Antwort sein. Danke!
Nam G VU
3
Entspricht dieser Glob nicht "." und auch?
Hertzsprung
4
@hertzsprung - dies ist der Fall, und es wird Ihnen eine Warnung angezeigt, dass es nicht gelöscht werden kann, ./und ../die versteckten Dateien werden trotzdem gelöscht.
Ryan Wheale
Dies funktioniert nicht auf der Mac-Konsole. Versteckte Dateien sind in dieser Befehlszeile noch vorhanden.
Agapitocandemor
So entfernen Sie alles aus dem aktuellen Verzeichnis:rm -r $(pwd)/{*,.*}
Jimmy Adaro
10

Wenn Sie nur Dateien in / path / to / directory löschen möchten, können Sie dies tun

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

oder

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

Sie können Lasten damit erledigen find, der Vorteil ist, dass Sie auflisten können, was gefunden wird, ohne es weiterzuleiten, rmsodass Sie sehen können, was gelöscht wird, bevor Sie beginnen.

Richard Holloway
quelle
2
GNU findals -deletePrädikat. Wenn Sie noch verwenden möchten -exec, und ersetzen \;mit +versammeln rmAnrufe zusammen, die Effizienz zu erhöhen.
Enzotib
1
Eine große Anzahl von Dateien mit '+' verursacht Probleme, da die Liste zu groß ist, genau wie bei rm -f *. und wenn große Mengen von Dateien aus demselben Ordner entfernt werden (in Millons), sind beide nicht gut :) Am Ende kam C ++ und entfernte Dateien in der Reihenfolge der Inodes im Verzeichnisbaum.
Osis
3
Sie sollten wirklich ein - nach dem rm hinzufügen. Wenn Sie keinen Dateinamen haben, wird -rf oder ähnliches als Argument für rm interpretiert. zB xargs -0 rm - oder -exec rm - {} \;
Richm
Sie können xargs auch das Argument -n übergeben. Dadurch werden die rm-Befehle auf eine maximale Anzahl von Argumenten aufgeteilt, dh 'xargs -n 100 -0 rm -' entfernt Dateien in
Blöcken
1
Sie können auch -maxdepth 1 hinzufügen, um sicherzustellen, dass find keine Dateien aus Unterverzeichnissen zurückgibt. dh find / path / to / directory -maxdepth 1 -type f
Richm
7

Um alle Dateien und Verzeichnisse (einschließlich der ausgeblendeten ) in einem Verzeichnis zu löschen , können Sie Folgendes versuchen:

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

    rm -rf dir_name && mkdir dir_name
    
  • verwenden find

    find dir_name -mindepth 1 -delete  
    

Hier geben wir -mindepth 1an, dass das Verzeichnis dir_name selbst ausgeschlossen werden soll.
Schauen Sie sich den folgenden Link an:
https://unix.stackexchange.com/questions/12593/how-to-remove-all-the-files-in-a-directory

zeekvfu
quelle
Vielen Dank für Ihren Rat und ich habe mehr Erklärung für die Links hinzugefügt.
Zeekvfu
3
Seien Sie vorsichtig, da das Löschen und Neuerstellen des Ordners zu unterschiedlichen / falschen Berechtigungen für diesen Ordner führen kann!
Einjohn
6

Wenn Sie auch alle Unterverzeichnisse und das Verzeichnis selbst entfernen möchten, können Sie verwenden rm -rf /path/to/directory. Aber überprüfen Sie Ihre Zeile immer noch einmal, bevor Sie die rm -rfEingabetaste drücken. Dies kann ebenfalls zu Problemen führen, z.

Tobias Kienzler
quelle
1

Da diese Frage bei Google ständig im Vordergrund steht, wenn ich selbst danach suche:

Die anderen Antworten haben unterschiedliche Probleme:

  1. Einige von ihnen gehören .und ..das ist laut, verwirrend und ärgerlich.

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

  3. Sie werden nicht in der richtigen (tiefsten zuerst) Reihenfolge gelöscht, um das Löschen des Verzeichnisses zu ermöglichen.

  4. Sie gehen in andere (gemountete) Dateisysteme über, was häufig unerwünscht ist.

  5. Es ist schwierig, sie mit zusätzlichen Parametern richtig zu erweitern (mehr dazu weiter unten).

Gehen Sie folgendermaßen vor, um alle Dateien UND Ordner in einem Verzeichnis REKURSIV zu löschen:

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 -xdevArgument hinzugefügt habe , um das Herabsteigen in Reittiere (wie /procusw.) zu verhindern .

Warum nicht -depthoder -delete?

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

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

vor dem -mindepthArgument, um auszuschließen, subdirdass sein Inhalt gelöscht wird.

Mehrdad
quelle
Und für die Tiefenbestellung gibt es eine -depthFlagge find.
Sergiy Kolodyazhnyy
Äh ... warum nicht einfach -deletemit verwendenfind ? -deleteist Tiefe an erster Stelle. Sie gehen bereits von Nicht-POSIX findmit dem aus -printf, daher können Sie auch -deleteoder-depth -print0 | xargs -0 rm
muru
@muru: Weil ich es nicht besser wusste ... Ich werde es ändern.
Mehrdad
@muru: Eigentlich scheint deine Methode nicht zu funktionieren -not \( -path "$DIR/subdir" \)... aber meine? Warum?
Mehrdad
@Mehrdad was soll das denn machen?
muru
0

Sie können cdin das Verzeichnis und dann den Befehl rm *.*wie in DOS ausführen, wenn Sie sich erinnern.

VK Mavani
quelle
1
DOS ist DEL für Dateien und RMDIR für geleerte Verzeichnisse. Bei versteckten und Systemdateien müssen diese ATTRIB-Attribute zuerst entfernt werden. Nicht annähernd so einfach;)
Eric
0

Zum Löschen des aktuellen Verzeichnisses können Sie beispielsweise verwenden rm -d ./*

-d weist an, auch Verzeichnisse zu löschen.

Arviman
quelle