2013-03-14 8 views
6

Täglich vom Benutzer hochgeladene Dateien, die älter als ein Monat sind, werden vom Server gelöscht. Benutzer-Uploads werden nach Tagen in Verzeichnisse gespeichert (zB /var/www/media/2013-03-13), so dass sie leicht die Dateien/Verzeichnisse identifizieren können, die gelöscht werden müssen.Batch löscht eine große Anzahl von Dateien

Problem: Löschen von 100.000 Dateien gleichzeitig macht den Server nicht mehr reagiert und dauert sehr lange. (Ubuntu 12.04 mit 2x2TB ext4 SATA3 Festplatte in Software RAID1). Im Moment macht PHP exec auf dem Befehl find /path/to/dir -maxdepth 1 -name '*' -delete.

Wie teile ich die zum Löschen erforderlichen Dateien auf? Doing a ls dauert wirklich lange auf diese großen Verzeichnisse.

Lösung muss nicht in PHP sein. Es erfordert nicht einmal das Aufteilen der Dateien in kleinere Batches.

Antwort

2
  1. Finden Sie die Verzeichnisse der Tage Sie
  2. Finden Sie die Verzeichnisse aller Tage
  3. entfernen 1. 2.
  4. rm -rf die Verzeichnisse, die Sie von 3.
erhalten behalten wollen

Ich bin mir nicht sicher, ob dies schneller ist als Ihre Methode, aber es vermeidet, alle Dateien in den Verzeichnissen explizit aufzulisten.

+0

Ich versuchte 'rm -rfv dirname' und' finde dirname -maxdepth 1 -print -delete 'so beide druckt die Dateinamen wie sie löschen. In beiden Fällen wird die Liste der Dateien, die gelöscht werden, als Standard ausgegeben, dann bleibt sie dort hängen. 'df' zeigt an, dass keine Dateien mehr gelöscht werden ... bis einige Dateien später gelöscht werden und dann wieder hängen – Nyxynyx

Verwandte Themen