Gibt es einen schnelleren Weg, ein Verzeichnis zu entfernen als "rm -rf"?


Antworten:


33

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

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.
Sparhawk

1
rsyncIn diesem Benchmark-Fall ist es schneller als rm -rf: web.archive.org/web/20130929001850/http://linuxnote.net/…
schmijos

11

Manchmal find $DIR_TO_DELETE -type f -deleteist 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, mkfsund re- mount.


1
soll man keine type -fdatei und kein verzeichnis bezeichnen? Außerdem werden beim Hinzufügen -printdie Dateien angezeigt, während sie gelöscht werden.
Leetbacoon

8

Wenn Sie den freien Speicherplatz nicht benötigen, können Sie das Löschen am schnellsten verzögern und dies im Hintergrund tun:

  • mkdir .delete_me
  • mv big-directory-that-i-want-gone .delete_me

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:

  • Überprüfen Sie Ihre Ausgabe, bevor Sie das Echo in der Crontab entfernen!
  • Das Verzeichnis .delete_me muss sich im selben Dateisystem befinden - falls dies nicht für alle offensichtlich ist.

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


2
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 :).


0

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.