Можете ли вы начать с вывода env | grep LANG
? Убедитесь, что все они указывают на правильный язык / страну, затем выполните команду dpkg, как указано в @vlp
gzip
не создает блочные -сжатые файлы (подробности см. в RFC ), поэтому сам по себе он не подходит для произвольного доступа. Вы можете начинать чтение из потока и останавливаться, когда захотите, поэтому ваш пример curl -r 0-2024
работает, но вы не можете выбрать поток в середине, если у вас нет дополнительного файла для предоставления недостающих данных (например, индексные файлы, созданныеgztool
).
Чтобы достичь того, что вы пытаетесь сделать, вам нужно использовать какое-то блочное сжатие; напр. bgzip
(, который создает файлы, которые могут быть распакованы простымgzip
)или bzip2
, и выполняет некоторую работу на принимающей стороне, чтобы определить, где лежат границы блока. Питер Кок написал несколько интересных постов на эту тему:BGZF -Заблокировано, больше и лучше GZIP! , Произвольный доступ к BZIP2?
Просто FWIW, gzip может быть доступен случайным образом, если был создан предыдущий индексный файл...
Я разработал инструмент командной строки, который может быстро и (почти -)произвольно обращаться к gzip, если указан индекс (если он не предоставлен, он создается автоматически):
https://github.com/circulosmeos/gztool
gztool
можно использовать для доступа к фрагментам исходного файла gzip, если эти фрагменты извлекаются в определенных точках байтов, на которые индекс указывает (-1 байт, чтобы быть уверенным, потому что gzip — это поток битов, а не байтов ), а лучше после них.
Например, , если начинается индексная точка,(gztool -ll index.gzi
предоставляет эти данные )в сжатом -байте 1508611 файла gzip, и после этого нам нужен 1M сжатых байтов:
$ curl -r 1508610-2508611 https://example.com/db/backups/db.sql.gz > chunk.gz
chunk.gz
будет занимать на диске только размер фрагмента! Теперь полный индекс (ранее только -после создания :, например, с помощью gztool -i *.gz
для создания индексов для всех ваших уже сжатых файлов или gztool -c *
для сжатия и создания индекса )должен также быть извлечены. Обратите внимание, что индексы составляют ~0,3% от размера gzip (или намного меньше, если gztool
сжимает сами данные ).
$ curl https://example.com/db/backups/db.sql.gzi -o chunk.gzi
Теперь извлечение можно выполнить с помощью gztool . Должен быть известен соответствующий несжатый байт (или переданный байт )из сжатых -1508610, но индекс может показать эту информацию с помощью gztool -ll
. См. примеры здесь . Предположим, что это байт 9009009. Или несжатый байт, который нам нужен, просто передается соответствующей первой индексной точке, содержащейся в chunk.gz. Давайте снова предположим, что этот байт также будет 9009009 для этого случая.
$ gztool -n 1508610 -b 9009009 chunk.gz > extracted_chunk.sql
gztool
прекратит извлечение данных, когда закончится файл chunk.gz
.
Возможно, это сложно, но будет работать без изменения метода сжатия или уже сжатых файлов. Но для них необходимо создать индексы.
ПРИМЕЧАНИЯ:Другой способ выполнить извлечение без использования параметра -n
— заполнить gzip-файл разреженными нулями :это делается для примера с командой dd
перед сначала curl
для извлечения файла chunk.gz
, поэтому:
$ dd if=/dev/zero of=chunk.gz seek=1508609 bs=1 count=0
$ curl -r 1508610-2508611 https://example.com/db/backups/db.sql.gz >> chunk.gz
$ curl https://example.com/db/backups/db.sql.gzi -o chunk.gzi
Таким образом, первые 1508609 байт файла являются нулями, но они не занимают места на диске . Без seek
в команде dd
все нули записываются на диск, что будет справедливо и для gzip
, но таким образом мы не занимаем лишнее место на диске. Тогда команде gztool не нужен параметр -n
. Обнуление данных не требуется, потому что, поскольку индекс существует, gztool
будет использовать его для перехода к точке индекса непосредственно перед несжатой позицией 9009009 байт, поэтому все предыдущие данные просто игнорируются:
$ gztool -b 9009009 chunk.gz > extracted_chunk.sql