Да, но это бесполезно.
Некоторые сжатые форматы файлов - в том числе те, которые используются gzip
, bzip2
и xz
- делать поддержки конкатенации изначально. (Это может потребовать явного согласия при использовании низкоуровневых API, но декомпрессоры командной строки принимают его по умолчанию.)
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
(Обратите внимание, что, например zcat
, буквально просто оболочка для шеллскрипта для gunzip
...)
Однако это означает, что каждое сообщение журнала сжимается индивидуально, без учета всего предыдущего содержимого. В результате, если вы попытаетесь связать много коротких сообщений в журнале, ваши коэффициенты сжатия будут очень и очень плохими. (В моих тестах, сжимающих случайный файл журнала таким образом, результирующий файл фактически увеличился до 120% от своего первоначального размера из-за всех повторяющихся издержек «заголовка».)
$ 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
Насколько мне известно, не существует инструмента, который бы поддерживал загрузку существующих заголовков сжатых файлов и использовал бы их для сжатия новых данных. Для этого вам необходимо запустить постоянный gzip
процесс и периодически передавать его журналы через стандартный ввод. Например:
#!/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 >&-
В «стандартной» оболочки, вы можете достичь того же с помощью именованных каналов, или даже более просто перенаправляет весь сценарий через gzip
. (Просто напечатайте одно и то же сообщение один раз на стандартный вывод и один раз на стандартный вывод, и вы получите свое tee
.)
Дополнительная информация о сцеплении сжатых потоков:
https://stackoverflow.com/questions/8005114/fast-concatenation-of-multiple-gzip-files
https://www.gnu.org/software/gzip/manual/html_node/Advanced-usage.html
Несколько сжатых файлов могут быть объединены. В этом случае gunzip извлечет всех участников сразу. Если один участник поврежден, другие участники могут быть восстановлены после удаления поврежденного элемента.
https://tukaani.org/xz/format.html
Конкатенация: Как и в случае файлов .gz и .bz2, можно объединять файлы .xz как есть. Распаковщик может распаковать составной файл, как если бы это был обычный однопотоковый файл .xz.