Wir haben ein Problem mit einem Ordner, der mit Hunderttausenden winziger Dateien unhandlich wird.
Es gibt so viele Dateien, bei deren Ausführung rm -rf
ein Fehler ausgegeben wird. Stattdessen müssen wir Folgendes tun:
find /path/to/folder -name "filenamestart*" -type f -exec rm -f {} \;
Dies funktioniert, ist jedoch sehr langsam und führt ständig dazu, dass nicht genügend Arbeitsspeicher zur Verfügung steht.
Gibt es einen besseren Weg, dies zu tun? Im Idealfall möchte ich das gesamte Verzeichnis entfernen, ohne auf den Inhalt zu achten.
linux
command-line
files
rm
Toby
quelle
quelle
rm -rf *
im Ordner scheitert wahrscheinlich an zu vielen Argumenten; aber was ist,rm -rf folder/
wenn Sie das gesamte Verzeichnis trotzdem entfernen möchten?rm -rf
?fsck
, um die nicht verwendeten Festplattenblöcke zurückzugewinnen. Dieser Ansatz scheint jedoch riskant zu sein und ist möglicherweise nicht schneller. Darüber hinaus kann die Dateisystemprüfung ein rekursives Durchlaufen des Dateisystembaums beinhalten.ccache
so großen Dateibaum hatte undrm
so lange brauchte (und das gesamte System träge machte), war es erheblich schneller, alle anderen Dateien aus dem Dateisystem zu kopieren, zu formatieren und zurück zu kopieren. Seitdem gebe ich solchen massiven kleinen Dateibäumen ein eigenes Dateisystem, so dass Siemkfs
direkt stattrm
.Antworten:
Die Verwendung von rsync ist überraschend schnell und einfach.
@saraths Antwort erwähnte eine weitere schnelle Wahl: Perl! Die Benchmarks sind schneller als
rsync -a --delete
.Quellen:
quelle
rsync
kann schneller alsrm
normal sein, da die Löschvorgänge in der richtigen Reihenfolge garantiert werden, sodass weniger Berechnungen für die Btress erforderlich sind. Siehe diese Antwort serverfault.com/a/328305/105902-P
Option zu rsync hinzufügen , um mehr Anzeige zu erhalten. Achten Sie auch auf die Syntax. Die nachgestellten Schrägstriche sind obligatorisch. Schließlich können Sie den Befehl rsync ein erstes Mal starten, wobei Sie die-n
Option haben, zuerst einen Probelauf zu starten .-a
gleich-rlptgoD
, aber zum Löschen ist nur-rd
nötigJemand auf Twitter schlug vor,
-delete
anstelle von-exec rm -f{} \;
Dies hat die Effizienz des Befehls verbessert. Es wird jedoch immer noch die Rekursion verwendet, um alles zu durchlaufen.
quelle
find
haben-delete
und anderefind
vielleicht.-delete
sollte-exec rm
aus Gründen der Sicherheit und Effizienz immer der Verfügbarkeit vorgezogen werden.Was ist mit so etwas wie:
find /path/to/folder -name "filenamestart*" -type f -print0 | xargs -0rn 20 rm -f
Sie können die Anzahl der gleichzeitig zu löschenden Dateien begrenzen, indem Sie das Argument für den Parameter ändern
-n
. Die Dateinamen mit Leerzeichen sind ebenfalls enthalten.quelle
-n 20
Bit wahrscheinlich nicht , da sich xargs sowieso auf akzeptable Argumentlistengrößen beschränken sollte.man xargs
:(...) max-chars characters per command line (...). The largest allowed value is system-dependent, and is calculated as the argument length limit for exec
. Diese-n
Option ist in solchen Fällen verfügbar, in denen xargs die CLI-Puffergröße nicht bestimmen kann oder wenn der ausgeführte Befehl einige Einschränkungen aufweist.Ein cleverer Trick:
Es ist super CPU-intensiv, aber sehr, sehr schnell. Siehe https://web.archive.org/web/20130929001850/http://linuxnote.net/jianingy/de/linux/a-fast-way-to-remove-huge-number-of-files.html
quelle
rsync -a --delete
vs 43 für gemeldetlsdent
. Das Verhältnis 10x war fürtime ls -1 | wc -l
vstime ./dentls bigfolder >out.txt
(das ist ein teilweise fairer Vergleich wegen> file
vswc -l
).Ich denke nicht, dass Sie das tun, was Sie zu tun glauben.
Zuerst habe ich eine große Anzahl von Dateien erstellt, um Ihre Situation zu simulieren:
Dann habe ich versucht, was ich erwartet hatte, und wie es sich anhört, als würdest du die Frage beantworten:
Aber das funktioniert:
quelle
rm -Rf bigdirectory
Mehrmals ausführen. Ich hatte ein Verzeichnis mit Tausenden von Millionen Unterverzeichnissen und Dateien. Ich konnte nicht einmalls
oderfind
oderrsync
in diesem Verzeichnis ausführen , weil der Speicher voll war. Der Befehl wurderm -Rf
viele Male beendet (zu wenig Speicher) und löschte nur einen Teil der Milliarden von Dateien. Aber nach vielen Wiederholungsversuchen war es endlich soweit. Scheint die einzige Lösung zu sein, wenn der Speicher knapp wird.Ich hatte die Gelegenheit zu testen ,
-delete
im Vergleich zu ,-exec rm \{\} \;
und für mich-delete
war die Antwort auf dieses Problem.Mit
-delete
gelöscht die Dateien in einem Ordner von 400.000 Dateien mindestens 1000-mal schneller alsrm
.Der Artikel 'Wie man eine große Anzahl von Dateien unter Linux löscht' legt nahe, dass es ungefähr dreimal schneller ist, aber in meinem Test war der Unterschied viel dramatischer.
quelle
find -exec
wird derrm
Befehl für jede Datei einzeln ausgeführt, deshalb ist er so langsam.Zu der
-delete
obigen Option: Ich verwende sie, um eine große Anzahl (1M + est) Dateien in einem temporären Ordner zu entfernen, den ich erstellt und versehentlich vergessen habe, jede Nacht aufzuräumen. Ich habe meine Festplatte / Partition versehentlich gefüllt und nichts anderes als derfind .
Befehl konnte sie entfernen . Es ist langsam, zuerst habe ich verwendet:Aber das dauerte eine EXTREME Zeit. Es begann nach ungefähr 15 Minuten, um einige der Dateien zu entfernen, aber ich schätze, dass es weniger als ungefähr 10 pro Sekunde entfernte, nachdem es schließlich gestartet wurde. Also habe ich versucht:
Stattdessen lasse ich es jetzt laufen. Es scheint schneller zu laufen, obwohl es die CPU EXTREM belastet, was der andere Befehl nicht war. Es läuft seit ungefähr einer Stunde und ich denke, ich bekomme wieder Speicherplatz auf meinem Laufwerk und die Partition wird allmählich "kleiner", aber es dauert immer noch sehr lange. Ich bezweifle ernsthaft, dass es 1.000-mal schneller läuft als das andere. Wie in allen Dingen wollte ich nur auf den Kompromiss zwischen Raum und Zeit hinweisen. Wenn Sie die CPU-Bandbreite übrig haben (wir tun dies), führen Sie die letztere aus. Es hat meine CPU zum Laufen gebracht (
uptime
Berichte):Und ich habe gesehen, dass die durchschnittliche Auslastung über 30,00 liegt, was für ein stark ausgelastetes System nicht gut ist, aber für unser System, das normalerweise leicht ausgelastet ist, ist es für ein paar Stunden in Ordnung. Ich habe die meisten anderen Dinge auf dem System überprüft und sie reagieren immer noch, sodass wir vorerst in Ordnung sind.
quelle
exec
möchten, möchten Sie mit ziemlicher Sicherheit nicht verwenden,-ls
und dofind . -type f -exec rm '{}' +
+ ist schneller, da es rm so viele Argumente gibt, wie es gleichzeitig verarbeiten kann.find … -delete
durchlaufennice
oderionice
, das kann helfen. So könnten einige Mount-Optionen in weniger crashsichere Einstellungen geändert werden. (Und je nachdem, was sich noch im Dateisystem befindet, ist der schnellste Weg, alles zu löschen, häufigmkfs
.)1
für Single-Core-Rechner dasselbe wie loadavg64
für 64-Core-Systeme - dh jede CPU ist zu 100% ausgelastet.Es gibt einige Methoden, die zum Löschen einer großen Anzahl von Dateien unter Linux verwendet werden können. Sie können die Option find with delete verwenden, die schneller ist als die Option exec. Dann kannst du perl unlink benutzen, dann sogar rsync. So löschen Sie eine große Anzahl von Dateien unter Linux
quelle
Ziehen Sie die Verwendung von Btrfs-Volume in Betracht und löschen Sie einfach das gesamte Volume für ein solches Verzeichnis mit einer großen Anzahl von Dateien.
Alternativ können Sie eine FS-Image-Datei erstellen, diese dann aushängen und löschen, um alles wirklich schnell auf einmal zu entfernen.
quelle
Unter der Annahme, dass GNU
parallel
installiert ist, habe ich Folgendes verwendet:parallel rm -rf dir/{} ::: `ls -f dir/`
und es war schnell genug.
quelle
Das Löschen von WIRKLICH GROSSEN Verzeichnissen erfordert einen anderen Ansatz, wie ich auf dieser Site erfahren habe - Sie müssen ionice verwenden. Es stellt (mit -c3) sicher, dass das Löschen nur durchgeführt wird, wenn das System über IO-Zeit verfügt. Die Systemlast wird nicht zu hoch und alles bleibt ansprechbar (obwohl meine CPU-Zeit für die Suche mit etwa 50% ziemlich hoch war).
quelle
+
anstelle von\;
würde dies beschleunigen, da mehr Argumente auf einmal an rm übergeben werden, weniger Forkingionice -c3 find <dir> -type f -delete
sollte im Hauptordner funktionieren
quelle
ls
funktioniert aufgrund der Anzahl der Dateien im Ordner nicht. Dafür musste ich aberfind
danke gebrauchen .ls -f
, wodurch die Sortierung deaktiviert wird. Zum Sortieren muss das gesamte Verzeichnis in den zu sortierenden Speicher geladen werden. Eine unsortierte Dateils
sollte in der Lage sein, ihre Ausgabe zu streamen.find . -print0 | xargs -0 rm
, die das Nullzeichen als Dateinamentrennzeichen verwenden.Für Izkatas Hinweis oben:
Das hätte fast geklappt - oder hätte geklappt -, aber ich hatte einige Probleme mit der Erlaubnis. Dateien befanden sich auf einem Server, aber ich verstehe immer noch nicht, woher dieses Berechtigungsproblem kam. Wie auch immer, Terminal bat um Bestätigung für jede Datei. Die Anzahl der Dateien lag bei 20.000, daher war dies keine Option. Nach "-r" habe ich die Option "-f" hinzugefügt, sodass der gesamte Befehl " rm -r -f Ordnername / " lautete . Dann schien es gut zu funktionieren. Ich bin ein Neuling bei Terminal, aber ich denke, das war okay, oder? Vielen Dank!
quelle
Abhängig davon, wie gut Sie diese Dateien entfernen müssen, würde ich die Verwendung von vorschlagen
shred
.Wenn Sie das Verzeichnis löschen möchten, es aber nicht entfernen und neu erstellen können, empfehle ich, es zu verschieben und sofort neu zu erstellen.
Dies ist schneller, ob Sie es glauben oder nicht, da nur eine Inode geändert werden muss. Denken Sie daran: Sie können diesen Geschmack auf einem Multicore-Computer nicht wirklich parallelisieren. Es kommt auf den Festplattenzugriff an, der durch das RAID oder was Sie haben, begrenzt ist.
quelle
shred
funktioniert nicht mit vielen modernen Dateisystemen.Wenn Sie Millionen von Dateien haben und jede der oben genannten Lösungen Ihr System in Stress versetzt, können Sie diese Inspiration ausprobieren:
Datei
nice_delete
:Und jetzt lösche die Dateien:
Find erstellt Stapel (siehe
getconf ARG_MAX
) von einigen Zehntausenden von Dateien und übergibt sie annice_delete
. Dadurch werden noch kleinere Stapel erstellt, um den Ruhezustand zu ermöglichen, wenn eine Überlastung festgestellt wird.quelle
Wenn Sie nur viele Dateien so schnell wie möglich
ls -f1 /path/to/folder/with/many/files/ | xargs rm
entfernen möchten, funktioniert dies möglicherweise in Ordnung. Führen Sie es jedoch besser nicht auf Produktionssystemen aus, da Ihr System möglicherweise zu E / A-Problemen wird und Anwendungen während des Löschvorgangs hängen bleiben.Dieses Skript funktioniert gut für viele Dateien und sollte sich nicht auf das Laden des Systems auswirken.
quelle