Ja, aber es ist nutzlos.
Einige komprimierten Dateiformate - einschließlich denen, die von gzip
, bzip2
und xz
- tun native Unterstützung Verkettung. ( Bei Verwendung von Low-Level-APIs ist möglicherweise eine explizite Anmeldung erforderlich. Dekomprimierer werden jedoch von Befehlszeilen-Dekompressoren standardmäßig akzeptiert.)
echo "test 1" | gzip >> log.txt.gz echo "test 2" | gzip >> log.txt.gz echo "test 3" | tee >(gzip >> log.txt.gz) echo "test 4" | (tee /dev/fd/3 | gzip >> log.txt.gz) 3>&1 zcat log.txt.gz
(Beachten Sie, dass zB zcat
buchstäblich nur ein Shellscript-Wrapper für gunzip
... ist)
Dies bedeutet jedoch, dass jede Protokollnachricht einzeln komprimiert wird, ohne den gesamten Inhalt zu berücksichtigen. Wenn Sie versuchen, viele kurze Protokollnachrichten zu verketten, sind die Kompressionsraten daher sehr, sehr schlecht. (Bei meinen Tests, die eine zufällige Protokolldatei auf diese Weise komprimieren, ist die resultierende Datei tatsächlich auf 120% ihrer ursprünglichen Größe angewachsen, da all diese wiederholten Kopfzeilen anfallen .)
$ dmesg > test.log $ cat test.log | gzip > test-single.log.gz $ cat test.log | while read -r line; do echo "$line" | gzip done > test-concat.log.gz $ du -h test* 500K test-concat.log.gz 416K test.log 64K test-single.log.gz
Meines Wissens gibt es kein Tool, das das Laden der vorhandenen Header der vorhandenen komprimierten Datei unterstützt und zum Komprimieren neuer Daten verwendet. Um dies zu erreichen, müssen Sie einen permanenten gzip
Prozess ausführen und die Protokolle regelmäßig über stdin protokollieren. Zum Beispiel:
#!/bin/bash # open a subprocess (the bash equivalent of 'popen') coproc LOG { gzip >> log.txt.gz; } echo "doing stuff" >&$ echo "doing more stuff" >&$ echo "still doing stuff" >&$ # close its stdin to finish compression exec >&-
In „Standard“ Shell, können Sie die gleichen mit Named Pipes erreichen, oder noch einfacher Umleiten das ganze Skript durch gzip
. (Drucken Sie einfach dieselbe Nachricht einmal an stdout und einmal an stderr, und Sie haben Ihre tee
.)
Weitere Informationen zur komprimierten Stream-Verkettung:
https://stackoverflow.com/questions/8005114/fast-concatenation-of-multiple-gzip-files
https://www.gnu.org/software/gzip/manual/html_node/Advanced-usage.html
Mehrere komprimierte Dateien können verkettet werden. In diesem Fall extrahiert gunzip alle Mitglieder gleichzeitig. Wenn ein Mitglied beschädigt ist, können andere Mitglieder möglicherweise nach dem Entfernen des beschädigten Elements wiederhergestellt werden
https://tukaani.org/xz/format.html
Verkettung: Genau wie bei .gz- und .bz2-Dateien ist es möglich, .xz-Dateien so zu verketten, wie sie sind. Der Dekomprimierer kann eine verkettete Datei so dekomprimieren, als wäre sie eine reguläre Einzelstrom-.xz-Datei.