Gibt es einen schnelleren Weg, ein Verzeichnis zu entfernen als "rm -rf"?
32
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?
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, fsckdie 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
rmwird 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 rmmuss 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 rmeinmal 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 -deleteausführen, der einen internen unlinkAufruf des Kernels verwendet (wie dies auch der rmFall 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, rmist 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/shmeiner RAM-Disk eine gute Idee sein.
Sie können den unlinkSystemaufruf nicht für Verzeichnisse verwenden (es wird eine EISDIRFehlermeldung angezeigt), sodass die erste Option nicht möglich ist.
James Henstridge
Wäre mv to / tmp schneller? Es scheint, dass mv auch viel Zeit in Anspruch nimmt.
Mohammad Moghimi
@MohammadMoghimi: Das Wechseln mvzwischen verschiedenen Dateisystemen / Partitionen bedeutet a cpgefolgt von a rm.
Enzotib
3
@enzotib Allerdings, wenn /tmpauf dem gleichen Dateisystem ist, frage ich mich, ob mvund Neustart schneller wäre? Ich bin mir nicht sicher, ob /tmpmit überhaupt gelöscht rmwird.
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. ;-)
Verwenden Sie anstelle dieses letzten Befehls find target_dir -maxdepth 3 -depth -type d -print0 | xargs -0 -P 5 rm -rf. Die -depthOption sagt find, dass Kinder zuerst aufgelistet werden sollen.
muru
2
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 mkfslö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.
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
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 gebenrm
. Dannrm
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äuftrm
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 internenunlink
Aufruf des Kernels verwendet (wie dies auch derrm
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.quelle
unlink
Systemaufruf nicht für Verzeichnisse verwenden (es wird eineEISDIR
Fehlermeldung angezeigt), sodass die erste Option nicht möglich ist.mv
zwischen verschiedenen Dateisystemen / Partitionen bedeutet acp
gefolgt von arm
./tmp
auf dem gleichen Dateisystem ist, frage ich mich, obmv
und Neustart schneller wäre? Ich bin mir nicht sicher, ob/tmp
mit überhaupt gelöschtrm
wird.rsync
In diesem Benchmark-Fall ist es schneller alsrm -rf
: web.archive.org/web/20130929001850/http://linuxnote.net/…Manchmal
find $DIR_TO_DELETE -type f -delete
ist es schneller alsrm -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
.quelle
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:
Anmerkungen:
Update: Ich habe einen tollen Trick gefunden, um mehrere RMS gleichzeitig auszuführen - dies hilft, wenn Sie ein großes Festplatten-Array haben:
-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
quelle
find target_dir -maxdepth 3 -depth -type d -print0 | xargs -0 -P 5 rm -rf
. Die-depth
Option sagtfind
, 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 :).
quelle
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.quelle