find, xargs, sleep

Gegeben

  • Linux-Server
  • RAID-1 aus zwei SATA-Platten (spinning rust)
  • ext4 Filesystem
  • ein Directory-Tree mit vielen Millionen Files + Sub-Directories

Aufgabe

In diesem Tree rekursiv leere Sub-Directories finden und diese löschen.

Bonusaufgabe

Das Ganze soll auf einem Produktionsserver laufen, die I/O muss niedrig gehalten werden, um die eigentlichen Aufgaben des Servers nicht zu beeinträchtigen.

Hinweis

Es handelt sich um etwa 1 Million leere Directories, welche zum Schluss gelöscht werden müssen.

Ansatz 1

find + xargs

find . -type d -empty -print0 | xargs -0 rmdir -v

Löst die Aufgabe, allerdings geht die die Average Queue Depth für die Platten hier nach kürzester durch die Decke und der Maschine kann mit ihrem Storage nicht mehr viel anfangen. Die Bonusaufgabe wird damit zumindest nicht bestanden.

Ansatz 2

find + xargs + sleep: Nach dem Löschen von n Directories kurz warten, damit die Platten genügend Zeit haben, um ihre Aufgaben abzuarbeiten.

find . -type d -empty -print0 | \
xargs -0 -n 100 bash -c '{ rmdir "$@" ; sleep 3 ; }'

Löst Aufgabe + Bonus zufriedenstellend und reicht mir für die einmalige Anwendung.

25×25 → 27×27

Nach nur einer Woche geht’s Schlag auf Schlag weiter mit dem Einsammeln von Kartenkacheln und dem Bilden eines möglichst großen Quadrats aus eben jenen. Die heutigen nur gut 50 Kilometer erhöhten das Quadrat von 25×25 Kacheln auf 27×27, waren aber die anstrengendsten 50 Kilometer seit sehr langer Zeit.

So viel Zuckersand wie ich heute durchqueren musste, habe ich lange nicht mehr gesehen – und das obwohl ich als Brandenburger ja einiges gewohnt bin. Die Wahl auf den Crosser als Weggefährt war definitiv falsch und wird beim nächsten Besuch in der Gegend auf jeden Fall auf das Mountainbike fallen.

25×25 → 27×27
Ausblick vom Aussichtsturm auf dem Gipsberg bei Sperenberg

HTML-Directory-Listing mit tree

Die meisten Webserver bringen eine Funktion mit, welche Directory-Listings dynamisch erzeugen und als HTML ausgeben kann.

Manchmal ist es aber nicht möglich, das eingebaute Feature des Webservers zu nutzen und man benötigt einen anderen Weg, um schnell eine Liste der Dateien in HTML auszugeben.

tree hilft in diesem Fall weiter – es hat nämlich neben der Ausgabe eines Plain-Text-Directory-Listings auch die Möglichkeit, das Listing als HTML zu rendern.

tree ist bei allen wichtigen Linux-Distribution verfügbar, auf macOS kann man es einfach per Homebrew installieren.

Ich habe es benutzt, um eine Liste von Bildern in einem Verzeichnis zu erstellen:

tree -H '.' -L 1 --noreport --charset utf-8 > index.html

Alle Optionen sind in der Manpage von tree ausführlich erklärt. Obiger Befehl erzeugt folgende HTML-Ausgabe: