К сожалению, чтобы распаковать отдельный элемент архива .tar.gz
вам нужно обработать весь архив, и не так много, чтобы исправить его.
Именно здесь архивы .zip
(и некоторых других форматов, например .rar
) работают намного лучше, потому что в формате zip
есть центральный каталог всех файлов, содержащихся в нем, с прямыми смещениями, указывающими на середину zip
файла, поэтому элементы архива можно быстро извлечь без обработки всего этого.
Вы можете спросить, почему обработка .tar.gz
такая медленная?
.tar.gz
(часто сокращается до .tgz
) - это просто архив .tar
сжатый с помощью компрессора gzip
. gzip
- это потоковый компрессор, который может работать только с одним файлом. Если вы хотите получить какую-либо часть потока gzip
, вы должны распаковать его целиком, и это то, что действительно убивает его для .tar.gz
(и для .tar.bz2
, .tar.xz
и других подобных форматов, основанных на .tar
).
Формат .tar
самом деле очень, очень простой. Это просто поток 512-байтовых заголовков файла или каталога (имя, размер и т.д.), За которыми следует содержимое файла или каталога (дополняется до 512 блоков размером с 0 байтами, если необходимо). Когда вы видите полностью нулевой блок 512 для заголовка, это означает конец архива .tar
.
Некоторые люди думают, что даже члены архива .tar
не могут быть доступны быстро, но это не совсем так. Если архив .tar
содержит несколько больших файлов, вы действительно можете быстро перейти к следующему заголовку, и, таким образом, вы можете найти необходимого члена архива за несколько поисков (но все же может потребоваться столько поисков, сколько имеется членов архива). Если ваш архив .tar
содержит множество мелких файлов, это означает, что быстрый поиск членов становится практически невозможным даже для несжатого .tar
.