Ich hatte ein Verzeichnis mit Millionen von GIF-Bildern gefüllt. Zu viele für den Befehl rm.
Ich habe den Befehl find folgendermaßen ausprobiert:
find . -name "*.gif" -print0 | xargs -0 rm
Das Problem ist, dass es meinen Computer sehr stark blockiert und für Kunden Zeitüberschreitungen verursacht, da es sich um einen Server handelt.
Gibt es eine Möglichkeit, alle diese Dateien schneller zu löschen, ohne die Maschine zu sperren?
rm -rf
wäre schneller. Es ist einen Versuch wert.Antworten:
Schneller ist nicht unbedingt das, was Sie wollen. Möglicherweise möchten Sie tatsächlich langsamer ausgeführt werden , sodass durch das Löschen weniger Ressourcen verbraucht werden, während es ausgeführt wird.
Verwenden Sie nice (1) , um die Priorität eines Befehls zu verringern.
Für I / O-gebundene Prozesse ist nice (1) möglicherweise nicht ausreichend. Der Linux-Scheduler berücksichtigt nicht nur die CPU, sondern auch die E / A-Priorität.
Wenn dies nicht der Fall ist, können Sie auch einen Schlaf hinzufügen, um die Geschwindigkeit zu verringern.
quelle
sleep
Hinzufügung - Ich hatte Probleme mit Servern, die an der E / A drosseln, obwohl sie verwendet wurdenionice -c 3
. Es verlängert die Zeit, die zum Löschen der Dateien benötigt wird, erheblich (natürlich), aber ich würde lieber warten, als die Anwendung herunterzufahren ...Da Sie unter Linux arbeiten und diese Aufgabe wahrscheinlich an E / A gebunden ist, empfehle ich, Ihrem Befehl die Priorität des inaktiven E / A-Schedulers zuzuweisen, indem Sie Folgendes verwenden
ionice(1)
:Im Vergleich zu Ihrem ursprünglichen Befehl kann dies sogar einige CPU-Zyklen ersparen, indem die Pipe zu vermieden wird
xargs
.quelle
find ... -exec
an dem das Sinn macht.find(1)
Dokumentation behauptet es. :) Und es sollte offensichtlich sein, dass esfind
effizienter ist , sich Dateien entfernen zu lassen, als einenrm
Befehl dafür zu geben.ionice -c3
senkt den Prio, um nur ausgeführt zu werden, wenn das E / A im Leerlauf ist, andernfalls ist dies perfekt. Beachten Sie,-delete
dass Sie mit diesem Befehl dasselbe tun können (einschließlich der Rückmeldung, dass es funktioniert) , da dies nicht der Standard für die Suche ist:ionice -c 3 find . -name '*.gif' -exec echo {} \; -exec rm {} \;
- Langsame, aber keine Verzögerung wichtiger Prozesse.Nein.
Es gibt keinen schnelleren Weg, um vom Soft-Format der Festplatte abzuweichen. Die Dateien werden sofort an rm übergeben (bis zur Begrenzung der Befehlszeile, es könnte auch an die gesetzt werden
xargs
), was viel besser ist, als rm für jede Datei aufzurufen. Also nein, es gibt definitiv keinen schnelleren Weg.Die Verwendung
nice
(oderrenice
eines laufenden Prozesses) hilft nur teilweise, da dies zur Planung der CPU- Ressource und nicht der Festplatte dient! Und die CPU-Auslastung wird sehr gering sein. Dies ist eine Linux-Schwäche - wenn ein Prozess die Festplatte "auffrisst" (dh viel damit arbeitet), bleibt die gesamte Maschine hängen. Modifizierter Kernel für die Echtzeitnutzung könnte eine Lösung sein.Was ich auf dem Server tun würde, ist , andere Prozesse manuell ihre Arbeit erledigen zu lassen - Pausen einschließen, damit der Server "atmet":
Dies wird 5 Sekunden nach jeweils 100 Dateien warten. Es wird viel länger dauern, aber Ihre Kunden sollten keine Verzögerungen bemerken.
quelle
rm *
wird sie*
mit allen Dateinamen in die Zeile eingeblendet und an übergebenrm
? Das ist unglaublich dumm. Warum sollte Shell ?" Wildcards erweitern?*
oder aufgerufen wurde,/*
und kann eine solche Entscheidung des Benutzers in Frage stellen.Wenn die Anzahl der zu löschenden Dateien die Anzahl der verbleibenden Dateien bei weitem übersteigt, ist es möglicherweise nicht die effizienteste Methode, den Baum der zu löschenden Dateien zu durchsuchen und alle diese Dateisystemaktualisierungen durchzuführen. (Es ist analog dazu, eine umständliche Speicherverwaltung mit Referenzzählung durchzuführen, jedes Objekt in einem großen Baum zu besuchen, um seine Referenz zu löschen, anstatt alles, was nicht mehr benötigt wird, in einem Schritt in Müll zu verwandeln und dann zu bereinigen.)
Das heißt, klonen Sie die Teile des Baums, die auf einem anderen Volume aufbewahrt werden sollen. Erstellen Sie auf dem ursprünglichen Volume ein neues, leeres Dateisystem. Kopieren Sie die gespeicherten Dateien wieder in ihre ursprünglichen Pfade. Dies ähnelt vage dem Kopieren der Speicherbereinigung .
Es wird einige Ausfallzeiten geben, diese sind jedoch möglicherweise besser als anhaltend schlechte Leistung und Betriebsstörungen.
Es mag in Ihrem System und Ihrer Situation unpraktisch sein, aber es ist leicht vorstellbar, dass dies der richtige Weg ist.
Angenommen, Sie möchten alle Dateien in einem Dateisystem löschen . Was wäre der Sinn, eins nach dem anderen zu wiederholen und zu löschen? Hängen Sie es einfach aus und erstellen Sie ein "mkfs" über der Partition, um ein leeres Dateisystem zu erstellen.
Oder möchten Sie alle Dateien mit Ausnahme von einem halben Dutzend wichtiger Dateien löschen? Holen Sie sich das halbe Dutzend da raus und ... "mkfs" übertrieben.
Irgendwann gibt es einen Break-Even-Punkt, an dem genügend Dateien verbleiben müssen, sodass das rekursive Löschen unter Berücksichtigung anderer Kosten wie Ausfallzeiten billiger wird.
quelle
Hast du es versucht:
Das + -Zeichen am Ende bewirkt, dass find weitere Dateien für den einzelnen auszuführenden Befehl rm enthält. Überprüfen Sie diese Frage für weitere Details.
quelle
-delete
) eine ziemlich neue Sache, die nicht immer da sein muss ..