извлечь один файл из огромного файла TGZ

19

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

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

Брайан
источник
Мне интересно примерно то же самое. Файл, который я ищу, быстро найден и извлечен, а затем мне нужно подождать час, чтобы обработать остальную часть достижения: o (
maasha

Ответы:

14

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

MVP
источник
3
GZIP может транслировать несжатые данные, он не должен отменить все это. Но, так как .tar - это сокращение от ленточного архива, вам нужно пройти весь файл, пока вы не найдете нужный файл. Хотя tar будет продолжать искать, потому что может быть другой, позже скопируйте его позже в файл tar.
Куртм
9

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

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

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

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

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

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

phogg
источник
Есть ли способ создать tar, чтобы первым вышел конкретный файл? так что --occurrenceбы сразу пнул первый файл? Я предполагаю, что речь идет о именах файлов, так что, например, появится что-то под названием aaaaa.jpg?
Джефф
1
@Джефф: Не совсем. Это просто препятствует tarпродолжению поиска в tar-архиве новых версий найденного файла. Вместо этого он возвращается, как говорится на странице руководства the Nth occurrence. Если вы укажете один файл для извлечения в командной строке и скажете, что --occurrencetar завершит работу, как только найдет этот файл, и, таким образом, фактически остановится на «первом файле».
Фогг
1

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

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

user55325
источник
1

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

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

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

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

Райана
источник
1
Я хотел понять, почему это все еще на 0 баллов. man tar(GNU tar 1.29) даже не печатает эту опцию. Однако в Ubuntu, по-видимому, он включен по умолчанию . Читая быстро, я не уверен, что --fast-readотличается от этого --occurrence. Но тогда --occurrenceдаже не на странице Ubuntu, а в man tar. Есть --fast-readи --occurrenceто же самое возможно?
Джефф
Ни одна из этих опций не указана в стандарте, и, как всегда в случае нестандартных опций, необходимо позаботиться о том, чтобы утилита в вашей системе их поддерживала. Опция --occurferences поддерживается GNU tar. Опция --fast-read поддерживается последними версиями tar FreeBSD, упакованными как bsdtar Ubuntu. Смотрите здесь для получения дополнительной информации.
Фогг