Как просмотреть сжатый файл, распаковав только частично?

#shell #unix

#оболочка #unix

Вопрос:

У меня есть сжатый файл, который я хочу просмотреть, используя что-то вроде утилиты «less» в unix. «меньше» предоставляет опцию предварительной обработки, с помощью которой я могу распаковать файл. Но что, если я хочу частично распаковать файл (как часть предварительной обработки) и направить / передать вывод в less? Преимущество этого заключается в распаковке только части файла.

Если есть какой-либо другой способ просмотра сжатого файла путем частичной распаковки, пожалуйста, дайте мне знать.

Спасибо, Рахул

Комментарии:

1. Откуда вы знаете, что, скажем, 25 КБ в сжатом файле — это та часть, которая вас интересует? (Кроме того, некоторые схемы сжатия должны распаковывать файл с самого начала, даже если они могут просто остановиться в какой-то момент.)

2. В моем файле есть несколько тегов, которые сообщают мне, где находятся данные. Мне нужно что-то в строках предварительной обработки в «меньше», чтобы я мог передать распакованный фрагмент файла в «меньше».

3. Итак, вы используете в основном .gz.tar вместо .tar.gz ? Звучит интересно. 🙂

4. Я использую zlib для сжатия файла по частям.

Ответ №1:

Для этого вам нужно придумать свой собственный формат сжатия; все существующие библиотеки (gzip, bzip2, lzma) являются потоковыми, но не фрагментированными (т. Е. Вы не можете искать в сжатом потоке).

Одним из решений является создание файла, подобного ZIP-архиву: поток записей, за которым следует оглавление (TOC). В вашем случае все записи (= фрагменты) будут иметь одинаковый размер до сжатия.

Попробуйте размер блока 4 КБ; это все равно должно обеспечить довольно хорошее сжатие, разумное количество накладных расходов и быстрое время распаковки для каждого блока. Запишите сжатые фрагменты в файл и запишите начальное смещение для каждого в TOC.

При поиске в потоке найдите нужное вам смещение в 4 КБ, прочитайте смещение из TOC, прочитайте сжатый фрагмент и распакуйте его.

[ПРАВИТЬ]Вам нужно создать небольшой инструмент, который может начать распаковку в любом месте архива и который просто продолжает распаковывать, пока не будет достигнут EOF. Но вы, вероятно, хотите знать, какая часть файла less отображается в данный момент. Для этого нет простого решения. less предназначен для отображения потока. Он не может «искать» в этом потоке; вместо less этого где-то создаст буфер, в котором он может искать. Если вы хотите избежать этого (обычно потому, что файл слишком большой), вы должны написать свою собственную версию less .

В качестве альтернативы, взгляните на исходный код less . Может быть, вы можете заменить часть кода «ввод буфера» чем-то, что может взаимодействовать с вашим декодером.

Комментарии:

1. Спасибо за ответ. Я уже использую указанное вами решение. Но я хочу, чтобы некоторый распакованный фрагмент данных был передан в «меньше». Когда пользователь достигает конца этого фрагмента, мне нужен способ распаковать следующий фрагмент в файле.

2. Вам нужно создать небольшой инструмент, который может начать распаковку в любом месте архива и который просто продолжает распаковывать, пока не будет достигнут EOF. Но вы, вероятно, хотите знать, какая часть файла less отображается в данный момент. Для этого нет простого решения. less предназначен для отображения потока. Он не может «искать» в этом потоке; вместо less этого где-то создаст буфер, в котором он может искать. Если вы хотите избежать этого (обычно потому, что файл слишком большой), вы должны написать свою собственную версию less

3. В качестве альтернативы, взгляните на исходный код less . Может быть, вы можете заменить часть кода «ввод буфера» чем-то, что может взаимодействовать с вашим декодером.

4. Спасибо, Аарон, тогда я рассмотрю «меньше».