14

У меня огромный tar-файл (около 500 ГБ), и я не хочу извлекать из него только один файл.
Однако, когда я запускаю tar -xvf file.tgz path/to/file впечатление, что он все еще загружает все содержимое в память и извлекает более часа. Я также пытался использовать --exclude=ignore.txt где ignore.txt - это список шаблонов в попытке остановить его обход бесполезных путей, но, похоже, это не работает.

Возможно, я не понимаю смолу ... Есть ли способ быстро извлечь файл?

4 ответа4

10

К сожалению, чтобы распаковать отдельный элемент архива .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 .

5

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

Эта опция указывает tar останавливаться, как только он находит первое вхождение каждого запрошенного вами файла, например,

tar xf large-backup.tar --occurrence etc/passwd etc/shadow

не будет проходить через весь тарбол после того, как найдет одну копию каждого из passwd и shadow , вместо этого он остановится. Если эти файлы появятся ближе к концу, выигрыш в производительности будет невелик, но если они появятся даже в середине файла 500G, вы сэкономите много времени.

Для людей, использующих tar для единовременного резервного копирования и не использующих настоящие ленточные накопители, такая ситуация, вероятно, является типичным случаем.

Обратите внимание , что вы можете также передать --occurrence=NUMBER для получения вхождения для каждого файла, который помогает , если вы знаете , что существует несколько версий в архиве. По умолчанию поведение равно NUMBER 1.

1

К сожалению, формат файла tar не содержит централизованного оглавления, поэтому архив должен быть прочитан последовательно, чтобы найти конкретный файл. Первоначально он был разработан для ленточных резервных копий ("деготь" происходит от обезьяны т ар резанца), которые не поддержали бы такую операцию в любом случае.

Итак, вам, вероятно, придется просто подождать.

1

При работе с большими тарболами используйте:

--fast-read для извлечения только первой записи архива, которая соответствует операнду имени файла, path/to/file в этом случае - который всегда уникален в tarball

tar -xvf file.tgz --fast-read path/to/file

выше будет искать, пока не найдет совпадение, а затем выйти

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .