Ich habe einen Ordner mit vielen Dateien und "rm -rf" nimmt viel Zeit in Anspruch. Gibt es eine schnellere Möglichkeit, ein Verzeichnis und seinen Inhalt (Unterverzeichnisse usw.) zu entfernen?
Ich habe einen Ordner mit vielen Dateien und "rm -rf" nimmt viel Zeit in Anspruch. Gibt es eine schnellere Möglichkeit, ein Verzeichnis und seinen Inhalt (Unterverzeichnisse usw.) zu entfernen?
Antworten:
Sie könnten versuchen, die Verknüpfung der Inode für das Verzeichnis aufzuheben, aber dann hätten Sie eine ganze Reihe von verwaisten Dateien, fsck
die sich überschlagen.
rm
ist so gut wie es geht.
Einige Leute erwähnen Randfälle, in denen einige Dinge schneller sind als andere. Aber stellen wir sicher, dass wir die besten Versionen der gleichen Dinge vergleichen.
Wenn Sie ein Verzeichnis und alles darin löschen möchten, empfehle ich Ihnen:
rm -rf path/to/directory
rm
wird intern die Dateien und Verzeichnisse , es wird zu löschen. Und das ist alles in kompilierten C . Es sind diese beiden Gründe, warum es am schnellsten ist.
Dies ist sehr pointiert nicht das Gleiche wie rm -rf path/to/directory/*
die erweitern auf Shell - Ebene und eine Last von Argumenten in geben rm
. Dann rm
muss man diese analysieren und dann von jedem zurückgreifen. Das geht viel langsamer.
Gerade als "Benchmark" ist das Vergleichen find path/to/directory -exec {} \;
Quatsch. Das läuft rm
einmal pro gefundener Datei. So langsam. Find kann xargs-artige Argumente für Build-Befehle verwenden, -exec rm {} +
aber das ist genauso langsam wie die Erweiterung. Sie können einen Aufruf -delete
ausführen, der einen internen unlink
Aufruf des Kernels verwendet (wie dies auch der rm
Fall ist), dies funktioniert jedoch zunächst nur für Dateien.
Also zu wiederholen, es sei denn, Sie werfen die Scheibe in flüssiges heißes Magma, rm
ist König .
In einem verwandten Fall löschen verschiedene Dateisysteme Dinge aufgrund ihrer Struktur mit unterschiedlichen Raten. Wenn Sie dies regelmäßig tun, können Sie diese Dateien in einer in XFS formatierten Partition speichern, die Löschvorgänge in der Regel recht schnell verarbeitet.
Oder verwenden Sie eine schnellere Festplatte. Wenn Sie über eine Menge RAM verfügen, kann die Verwendung /dev/shm
einer RAM-Disk eine gute Idee sein.
unlink
Systemaufruf nicht für Verzeichnisse verwenden (es wird eine EISDIR
Fehlermeldung angezeigt), sodass die erste Option nicht möglich ist.
mv
zwischen verschiedenen Dateisystemen / Partitionen bedeutet a cp
gefolgt von a rm
.
/tmp
auf dem gleichen Dateisystem ist, frage ich mich, ob mv
und Neustart schneller wäre? Ich bin mir nicht sicher, ob /tmp
mit überhaupt gelöscht rm
wird.
rsync
In diesem Benchmark-Fall ist es schneller als rm -rf
: web.archive.org/web/20130929001850/http://linuxnote.net/…
Manchmal find $DIR_TO_DELETE -type f -delete
ist es schneller als rm -rf
.
Vielleicht möchten Sie es auch ausprobieren mkdir /tmp/empty && rsync -r --delete /tmp/empty/ $DIR_TO_DELETE
.
Schließlich, wenn Sie den Inhalt einer ganzen Partition löschen müssen, wird wahrscheinlich die schnellste sein umount
, mkfs
und re- mount
.
type -f
datei und kein verzeichnis bezeichnen? Außerdem werden beim Hinzufügen -print
die Dateien angezeigt, während sie gelöscht werden.
Wenn Sie den freien Speicherplatz nicht benötigen, können Sie das Löschen am schnellsten verzögern und dies im Hintergrund tun:
Dann haben Sie eine Crontab, die dies in einer ruhigen Zeit im Hintergrund mit einer niedrigen E / A-Priorität ausführt:
3 3 * * * root ionice -c 3 nice find /path/to/.delete_me -maxdepth 1 ! -name \. -exec echo rm -rf "{}" +
Anmerkungen:
Update: Ich habe einen tollen Trick gefunden, um mehrere RMS gleichzeitig auszuführen - dies hilft, wenn Sie ein großes Festplatten-Array haben:
ionice -c 3 nice find target_directory -depth -maxdepth 3 | xargs -d \n -P 5 -n 5 rm -rf
-Tiefe, um eine Tiefendurchquerung durchzuführen.
-maxdepth, um die Tiefe des Verzeichnisdurchlaufs zu begrenzen, damit nicht einzelne Dateien abgehört werden.
-d \ n, um Leerzeichen in Dateinamen zu behandeln.
-P und -n regeln den Grad der Parallelität (siehe Manpage).
Ref: http://blog.liw.fi/posts/rm-is-too-slow/#comment-3e028c69183a348ee748d904a7474019
Update 2 (2018): Mit ZFS, das mit Ubuntu 18.04 ausgeliefert wird, verwende ich es für alles und erstelle einen neuen Datensatz für jedes große Projekt. Wenn Sie im Voraus planen und dies im Voraus tun, können Sie ein Dateisystem einfach "zfs zerstören", wenn Sie fertig sind. ;-)
Ich habe die Anweisungen aus dem zfsonlinux-Wiki verwendet, um Ubuntu nativ in ZFS zu installieren: https://github.com/zfsonlinux/zfs/wiki/Ubuntu-18.04-Root-on-ZFS
find target_dir -maxdepth 3 -depth -type d -print0 | xargs -0 -P 5 rm -rf
. Die -depth
Option sagt find
, dass Kinder zuerst aufgelistet werden sollen.
Ich denke, das Problem ist, dass es keine perfekte Möglichkeit gibt, ein sehr großes Verzeichnis und seinen gesamten Inhalt ohne ein echtes indiziertes Dateisystem zu entfernen, das das Aufheben von Verknüpfungen versteht und nicht bedeutet, dass es der Meinung ist, dass es fehlende Dateien für FSCK gibt. Es muss Vertrauen geben.
Zum Beispiel habe ich Zoneminder für eine Golfstrecke laufen. Ich habe ein Linux-Raid mit 1,5 TB erstellt, um die immense Datenmenge zu verarbeiten, die sie pro Tag aufzeichnet (12 Kamera-Feeds). Kurz gesagt, der Ordner für alle erfassten Daten umfasst etwa 1,4 TB ihres Speichers. Viel zu spülen
Es macht keinen Spaß, ZM neu zu installieren und die alte Bibliothek mit 1,4 TB zu leeren, da das Löschen der alten Images 1 bis 2 Tage dauern kann.
Ein wirklich indizierter FS ermöglicht das Löschen des Verzeichnisses und weiß, dass die Daten darunter tot sind und das Ausblenden der Daten eine Verschwendung unserer Zeit und PC-Ressourcen darstellt. Es sollte eine Option sein, gelöschte Daten auf Null zu setzen. RM braucht in der realen Welt auf ext4 einfach zu lange.
Antwort: Das rekursive Aufheben der Verknüpfung aller Dateien wäre geringfügig schneller, aber Sie müssten dennoch eine gewisse Zeit einplanen, um FSCK auszuführen.
Erstellen Sie ein Skript, das einen rekursiven "FOR" -Befehl ausführt, der alle Dateien unter Ihren Ordnern "entkoppeln" kann, und bereinigen Sie dann einfach alle Ordner mit rm oder rmdir. Führen Sie FSCK manuell aus, um den Rest der Daten auf Null zu setzen, wenn dies zweckmäßig ist. Ein bisschen faul hat es nicht ausgeschrieben, sorry :).
Obwohl dies nicht sinnvoll ist, wenn Sie ein vorhandenes Verzeichnis löschen möchten, möchte ich erwähnen, dass eine mögliche Strategie, wenn Sie wissen, dass Sie ein Verzeichnis mit einer Vielzahl von Dateien haben, die Sie regelmäßig löschen müssen, darin besteht, das Verzeichnis in ein eigenes Dateisystem zu kopieren ( zB Partition). Wenn Sie es dann mkfs
löschen müssen, heben Sie die Bereitstellung auf , führen Sie ein aus und stellen Sie es erneut bereit. Zum Beispiel rät OpenBSD, dies zu tun/usr/obj
, wenn viele Dateien während eines Builds des Systems erstellt werden und vor dem nächsten Build gelöscht werden müssen.