Ich habe einen peinlich parallelen Prozess, der eine große Menge nahezu (aber nicht vollständig) identischer Dateien erstellt. Gibt es eine Möglichkeit, die Dateien "on the fly" zu archivieren, damit die Daten nicht mehr Speicherplatz als nötig beanspruchen?
Der Prozess selbst akzeptiert Befehlszeilenparameter und druckt den Namen jeder in stdout erstellten Datei. Ich rufe es auf, mit parallel --gnu
dem die Eingabe (die aus einem anderen Prozess stammt) verteilt und die Ausgabe gesammelt wird:
arg_generating_process | parallel --gnu my_process | magic_otf_compressor
EINFACHES BEISPIEL für den ersten Teil des Rohrs in bash
:
for ((f = 0; $f < 100000; f++)); do touch $f; echo $f; done
Wie könnte das magic_otf_compressor
aussehen? Es soll jede Eingabezeile als Dateinamen behandeln, jede Datei in ein komprimiertes .tar
Archiv kopieren (dasselbe Archiv für alle verarbeiteten Dateien!) Und es dann löschen. (Eigentlich sollte es ausreichen, den Namen jeder verarbeiteten Datei zu drucken, ein anderer | parallel --gnu rm
könnte sich um das Löschen der Dateien kümmern.)
Gibt es ein solches Werkzeug? Ich denke nicht daran, jede Datei einzeln zu komprimieren, dies würde viel zu viel Speicherplatz verschwenden. Ich habe nachgesehen archivemount
(wird das Dateisystem im Speicher halten -> unmöglich, meine Dateien sind zu groß und zu viele) und avfs
(konnte es nicht dazu bringen, mit FUSE zusammenzuarbeiten). Was habe ich vermisst?
Ich bin nur einen Schritt davon entfernt, ein solches Tool selbst zu hacken, aber jemand muss es schon einmal getan haben ...
EDIT : Im Wesentlichen denke ich, dass ich nach einem Standard-Front-End suche libtar
(im Gegensatz zum Befehlszeilen-Front-End tar
, das Argumente aus der Befehlszeile liest).