#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. Спасибо, Аарон, тогда я рассмотрю «меньше».