/bin/tar: Argument list too long

Wo sind bloss die 50GB Speicherplatz geblieben?

Diese Frage musste ich mir heute Morgen auf einem unserer Solaris 8 Systeme stellen. Nach einigen Aufräumarbeiten war der Übeltäter gefunden. Eines unserer Projektverzeichnisse hatte Logdateien enthalten, welche 38GB gefressen hatten.

Das Problem: Mir konnte natürlich wiedermal niemand sagen ob die Daten noch gebraucht werden.

Also wollte ich all die Dateien mit gtar/bzip2 Archivieren. Doch da hatte ich die Rechnung ohne den Wirt gemacht. Ein gtar cvjpf Archivdatei.tar.bz2 logfiles* scheiterte an der Menge der übergebenen Dateien und beendete sich mit der Fehlermeldung:

/bin/tar: Argument list too long

Was? Wieviele Datein waren denn da auf dem Server? Ein ls -1|wc -l brachte mir die Gewissheit.

372’378 Dateien!

Das ist natürlich eine Menge. Und wie sichere ich die nun? Ganz einfach. Zuerst wird mittels find eine Liste aller Dateien erstellt und danach wird das tar File anhand dieser Datei erzeugt.

find . -name '*.log' -print >/tmp/archivliste
tar cvjpf logfiles.tar.bz2 --files-from /tmp/archivliste

So einfach kann es sein… 🙂

Nachtrag:

Will man die Dateien löschen, hat man mit rm natürlich wieder das selbe Problem. Aus diesem Grund hier der Befehl, wie die Dateien löschen kann.

find . -name '*.log' | xargs rm

Uebrigens:

Der Grund, warum es über die Argumente nicht geht ist die beschränkte Puffergrösse für Argumente. Denn ein logfiles* wird in logfiles1 logfiles2 logfiles3 etc. aufgeschlüsselt. Und bei knapp 380’000 Daeien ist dieser Pufferplatz schnell einmal voll. Zumal der Puffer wohl nur zwischen 32Kb und 64Kb gross sein wird.