У меня огромный tar-файл (около 500 ГБ), и я не хочу извлекать из него только один файл.
Однако при запуске tar -xvf file.tgz path/to/file
кажется, что все содержимое загружается в память, а извлечение занимает более часа. Я также пытался использовать, --exclude=ignore.txt
где ignore.txt - список шаблонов, пытаясь не дать ему пересечь бесполезные пути, но, похоже, это не работает.
Возможно, я не понимаю tar ... Есть ли способ быстро извлечь файл?
Ответы:
К сожалению, чтобы распаковать отдельный элемент
.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
.источник
Если вы извлекаете только один файл из большого файла tar, вы используете GNU
tar
, и вы можете гарантировать, что файл tar никогда не добавлялся, тогда вы можете значительно повысить производительность, используя--occurrence
.Эта опция указывает tar останавливаться, как только он находит первое вхождение каждого запрошенного вами файла, например,
не будет проходить через весь тарбол после того, как найдет одну копию каждого из них,
passwd
иshadow
вместо этого остановится. Если эти файлы появятся ближе к концу, выигрыш в производительности будет небольшим, но если они появятся даже на полпути через файл 500G, вы сэкономите много времени.Для людей, использующих
tar
для единовременного резервного копирования и не использующих настоящие стримеры, эта ситуация, вероятно, является типичным случаем.Обратите внимание , что вы также можете пройти ,
--occurrence=NUMBER
чтобы получить NUMBERth вхождение каждого файла, который помогает , если вы знаете , что есть несколько версий в архиве. По умолчанию поведение равноNUMBER
1.источник
--occurrence
бы сразу пнул первый файл? Я предполагаю, что речь идет о именах файлов, так что, например, появится что-то под названием aaaaa.jpg?tar
продолжению поиска в tar-архиве новых версий найденного файла. Вместо этого он возвращается, как говорится на странице руководстваthe Nth occurrence
. Если вы укажете один файл для извлечения в командной строке и скажете, что--occurrence
tar завершит работу, как только найдет этот файл, и, таким образом, фактически остановится на «первом файле».К сожалению, формат файла tar не содержит централизованного оглавления, поэтому архив необходимо читать последовательно, чтобы найти конкретный файл. Первоначально он был разработан для ленточных резервных копий ( «деготь» происходит от т обезьяны ар резанца), которые не поддержали бы такую операцию в любом случае.
Итак, вам, вероятно, придется просто подождать.
источник
При работе с большими тарболами используйте:
выше будет искать, пока не найдет совпадение, а затем выйти
источник
man tar
(GNU tar 1.29) даже не печатает эту опцию. Однако в Ubuntu, по-видимому, он включен по умолчанию . Читая быстро, я не уверен, что--fast-read
отличается от этого--occurrence
. Но тогда--occurrence
даже не на странице Ubuntu, а вman tar
. Есть--fast-read
и--occurrence
то же самое возможно?