Допустим, file.txt.gz
имеет 2 ГБ, и я хочу увидеть последние 100 строк или около того.zcat <file.txt.gz | tail -n 100
прошел бы через все это.
Я понимаю, что сжатые файлы не могут быть доступны случайным образом, и если я разрежу, скажем, последние 5 МБ, то данные сразу после вырезания будут мусором - номожет ли gzip повторно выполнить синхронизацию и декодировать остальную часть потока?
Если я правильно понимаю, gzip stream - это простой поток команд, описывающих, что выводить, - с ним должна быть возможность синхронизации.Затем имеется скользящее окно 32 КБ для самых последних несжатых данных - которое начинается как мусор, конечно, если мы начнем с середины, но я предполагаю, что обычно оно быстро заполняется реальными данными, и с этого момента декомпрессия тривиальна (ну,возможно, что что-то перезаписывается снова и снова от начала файла до конца, и поэтому скользящее окно никогда не очищается - меня удивило бы, если бы это было так часто - и если это произойдет, мы просто обработаем весь файл).
Я не очень-то стремлюсь сам сделать этот род gzip-хакерства - никто не делал этого раньше, для работы с поврежденными файлами, если ничего больше?
В качестве альтернативы - если gzip действительно не может сделатьчто, возможно, есть какие-нибудь другие программы сжатия потоков, которые работают почти так же, как они, за исключением того, что они позволяют повторную синхронизацию в среднем потоке?печатать возраст байтов в скользящем окне.Оказывается, что вещи действительно копируются снова и снова, и даже после 5 МБ + скользящее окно все еще содержит материал из первых 100 байтов и из случайных мест по всему файлу.
Мы даже не можем обойти эточитая первые несколько блоков и последние несколько блоков, поскольку эти первые байты не имеют прямой ссылки, это просто очень длинная цепочка копий, и единственный способ выяснить, на что она ссылается, - это обработать все это.
По сути, с опциями по умолчанию то, что я хотел, вероятно, невозможно.
С другой стороны, у zlib есть опция Z_FULL_FLUSH
, которая очищает это скользящее окно для синхронизации.Так что вопрос все еще стоит.Предполагая, что zlib время от времени синхронизируется, есть ли какие-нибудь инструменты для чтения только до конца, без обработки всего этого?