Wie kann ich einen Ordner mit vielen Unterordnern schnell löschen?

15

Ich habe einen Ordner mit 266778 Unterordnern. Wie kann ich es löschen?

Ich habe versucht

cd ~/.local/share/Trash/
sudo rm -rf *

aber es braucht viel zeit. Nach 1 Minute 25 Sekunden Echtzeit und 0,072 Sekunden Benutzerzeit wurden nur 2500 Ordner gelöscht. Auf diese Weise dauert das Löschen dieses Ordners mehr als zwei Stunden.

Gibt es eine schnellere Möglichkeit, diesen Ordner zu löschen? Warum gibt es einen so großen Unterschied zwischen Benutzerzeit und Echtzeit?

real    1m25.474s
user    0m0.072s
sys     0m28.142s

Ich benutze Linux 2.6.32 (Ubuntu 10.04.4 LTS).

Martin Thoma
quelle
Ich habe dieses Problem gerade gegoogelt und es scheint, dass einige Leute herausgefunden haben, dass rsync sehr effizient als Tool zum Löschen vieler Dateien verwendet werden kann. Ob es wirklich schneller geht, bleibt Ihnen überlassen.
Johan
2
Was es wert ist: Die Leistung beim Löschen vieler Ordner / Dateien hängt stark vom Dateisystem ab. Meiner Erfahrung nach kann der Unterschied beim Löschen von Millionen kleiner Dateien auf ext3 (langsam) im Vergleich zu XFS (schnell) Stunden betragen.
PDO
Wenn Sie diesen Fall häufig haben und vorausplanen können, indem Sie ein Dateisystem wie btrfs und ein Subvolume verwenden, können Sie die Dinge schnell beschleunigen, indem Sie nur dieses Subvolume sichern.
PlasmaHH
Hier finden Sie die Antwort. Das Perl ist das schnellste. unix.stackexchange.com/questions/37329/…
SDsolar

Antworten:

17

Wenn Ihre Version von "find" den Unterbefehl -delete implementiert, können Sie es versuchen

find directory -delete

In diesem Fall:

find ~/.local/share/Trash/ -delete

Einige Befehle, wie z. B. rm, führen den größten Teil ihrer Arbeit im Kernel aus. Genauer gesagt in den Dateisystemroutinen. Die für die Ausführung von Systemaufrufen aufgewendete Zeit wird auf diese Weise abgerechnet. Während der Befehl "rm" über einen langen Zeitraum ausgeführt wird, erledigt er im Benutzerland nicht viel. Die Systemaufrufe erledigen den größten Teil der Arbeit.

Johan
quelle
+1; obwohl dies auch das übergeordnete Verzeichnis löscht und ich vermute, dass das OP nur den Inhalt des Papierkorbordners löschen wollte, nicht den Ordner selbst
don_crissti
1
@don_crissti: gute Bemerkung. Wenn das OP nur Unterverzeichnisse unter ~ / .local / share / Trash löschen wollte (und keine Dateien auf der ersten Ebene), dann: find ~/.local/share/Trash/*/ -delete (Natürlich werden auch Dateien (und Verzeichnisse) in einem dieser Trashs gelöscht. / * / subdirs als auch)
Olivier Dulac
2
+1 für die Erklärung des merkwürdigen Verhaltens vontime
Martin Thoma
3
Ist das find directory -deletewirklich schneller als rm -rf directory? Immerhin führen sie die gleiche Arbeit aus, und es gibt keine zwei Möglichkeiten, dies zu tun.
Gilles 'SO - hör auf böse zu sein'
1
@ Johan finden ist wirklich schnell. Hattest du jemals die Gelegenheit, den Grund herauszufinden?
Harshdeep
20

Es hängt von Ihrer Definition von schnell ab . Die Antworten geben hier bereits eine gute Lösung für tatsächlich die Verzeichnisse aus dem Dateisystem entfernt wird , aber wenn das, was Sie wirklich brauchen , um das Verzeichnis zu befreien ist Namen so schnell wie möglich ein Umbenennungs auf demselben Dateisystem ist blitzschnell:

{ mv directory directory.gone && rm -rf directory.gone; } &

Technisch ist dies ein Betrug, da ich das Löschen nicht beschleunigt habe, aber praktisch ist es sehr nützlich: Ich verwende diesen Trick die ganze Zeit, damit ich nicht auf langsame Löschvorgänge warten muss.

Kojiro
quelle
Groß. Was ist Ihr Anwendungsfall, um dies die ganze Zeit zu tun? Wenn Sie es oft tun, besteht dann nicht die Gefahr, dass Sie einen Rückstand haben, mehrere "directory.gone's" erhalten und scheitern? Ich nehme an, Sie verwenden ein Suffix wie '$$' oder '% (Datum ...)'
smci
1
Wenn ich das brauchte, könnte ich wahrscheinlich mktemp mit Argumenten verwenden, die sicherstellen, dass es auf demselben Dateisystem bleibt. Aber ich kann nicht sagen, dass ich gerade ein konkretes Beispiel habe.
Kojiro
kojiro yeah danke, mktempist das , woran ich mich erinnern wollte ...
smci
1

rm -rf directoryoder ist rm -rf *natürlich die schnellste Methode, es sei denn, Ihre lokale rmImplementierung ist fehlerhaft.

Die Verwendung findbietet keine Vorteile.

Ob dies schnell oder langsam ist, hängt hauptsächlich vom Dateisystem und der Betriebssystemimplementierung ab. Die Frage scheint also unangemessen zu sein.

UFS und ZFS auf Solaris sind dafür bekannt , mit dieser Art von Aufgabe sehr schnell sein , da beide Dateisystem - Implementierungen Hintergrund löschen Code verzögert umfassen , dass die Ursachen unlink()und rmdir()Anrufe schnell selbst zurückzukehren , wenn die damit verbundene Aufgabe mehr Zeit insgesamt dauern wird.

Mit dem verzögerten Löschen des Hintergrunds im Kernel können auch die Verzeichnisaktualisierungen schnell durchgeführt werden, was den gesamten Vorgang beschleunigt.

schily
quelle
Während man vielleicht denkt, dass dies nicht der Fall ist, ist dies tatsächlich nicht der Fall, wie diese Antwort beschreibt.
Hitechcomputergeek
0

Dies ist nur eine Teilantwort, die Aufschluss über die drei vom Befehl zurückgegebenen Werte gibt. Zitiert aus der time(1)Manpage :

(i) die verstrichene Echtzeit zwischen Aufruf und Beendigung, (ii) die Benutzer-CPU-Zeit (die Summe der tms_utimeund tms_cutimeWerte in a struct tmswie von zurückgegeben times(2)) und (iii) die System-CPU-Zeit (die Summe der tms_stimeund tms_cstimeWerte in a struct tmswie zurückgegeben von times(2)). "

schaiba
quelle