Существует ли более интеллектуальный tar или cpio для эффективного извлечения файла, хранящегося в архиве?

Я использую tar архивировать группу очень большого размера (несколько ГБ) bz2 файлы.

Если я использую tar -tf file.tar для составления списка файлов в архиве требуется очень много времени (~10-15 минут).

Точно так же, cpio -t < file.cpio Это займет столько же времени, плюс или минус несколько секунд.

Соответственно, извлечение файла из архива (через tar -xf file.tar myFileOfInterest.bz2 например) так же медленно.

Существует ли какой-либо архивный метод, который хранит легкодоступный "каталог" с архивом, чтобы можно было быстро получить отдельный файл в архиве?

Например, какой-то каталог, в котором хранится указатель на определенный байт в архиве, а также размер файла, который нужно извлечь (а также любые другие особенности файловой системы).

Есть ли инструмент (или аргумент tar или же cpio) что позволяет эффективный поиск файла в архиве?

10 ответов

Решение

tar (и cpio, afio, pax и подобные программы) являются потоково-ориентированными форматами - они предназначены для потоковой передачи непосредственно на ленту или передачи в другой процесс. в то время как теоретически можно было бы добавить индекс в конец файла / потока, я не знаю ни одной версии, которая это делает (хотя это было бы полезным расширением)

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

если dar не включен в ваш unix/linux-dist, вы можете найти его по адресу:

http://dar.linux.free.fr/

Вы можете использовать SquashFS для таких архивов. это

  • предназначен для доступа с использованием драйвера предохранителя (хотя существует традиционный интерфейс)
  • сжатый (чем больше размер блока, тем эффективнее)
  • входит в ядро ​​Linux
  • хранит UID /GID и время создания
  • с поддержкой endianess, поэтому вполне переносимый

Единственный известный мне недостаток - это то, что он доступен только для чтения.

http://squashfs.sourceforge.net/ http://www.tldp.org/HOWTO/SquashFS-HOWTO/whatis.html

Пока он не хранит индекс, star подразумевается, чтобы быть быстрее, чем tar, Кроме того, он поддерживает более длинные имена файлов и лучше поддерживает атрибуты файлов.

Я уверен, что вы знаете, распаковка файла занимает много времени и, вероятно, будет фактором скорости извлечения, даже если бы был индекс.

Изменить: Вы также можете взглянуть на xar, Он имеет заголовок XML, который содержит информацию о файлах в архиве.

С указанной страницы:

XML-заголовок Xar позволяет ему содержать произвольные метаданные о файлах, содержащихся в архиве. В дополнение к стандартным метаданным файла Unix, таким как размер файла и время его изменения и создания, xar может хранить информацию, такую ​​как биты файлов ext2fs и hfs, флаги unix, ссылки на расширенные атрибуты, информацию Mac OS X Finder, Mac OS X-разветвления ресурсов и хеши данных файла.

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

Торбьерн Равн Андерсер прав. GNU tar создает "поисковые" архивы по умолчанию. Но он не использует эту информацию при чтении этих архивов, если не указана опция -n. С опцией -n я просто извлек 7 ГБ файл из 300 ГБ архива за время, необходимое для чтения / записи 7 ГБ. Без -n это заняло больше часа и не дало результата.

Я не уверен, как сжатие влияет на это. Мой архив не был сжат. Сжатые архивы не являются "доступными для поиска", потому что текущий (1.26) tar-файл GNU разгружает сжатие во внешнюю программу.

Вы можете использовать 7z (7zip) формат архивирования / сжатия, если у вас есть доступ к p7zip-full пакет.

В Ubuntu вы можете использовать эту команду для установки:

$ sudo apt-get install p7zip-full

Для создания архива вы можете использовать 7z a <archive_name> <file_or_directory> и если вы не хотите сжимать файлы и хотите просто "хранить" их как есть, вы можете использовать -mx0 вариант как:

$ 7z a -mx0 myarchive.7z myfile.txt

Creating archive myarchive.7z

Затем вы можете извлечь файлы, используя 7z e:

$ 7z e myarchive.7z

Processing archive: myarchive.7z
Extracting  myfile.txt

Или вы можете перечислить индекс архива с 7z l что удобно для поиска с grep:

$ 7z l myarchive.7z | grep

2014-07-08 12:13:39 ....A            0            0  myfile.txt

Это также t возможность проверить целостность, u добавить / обновить файл в архиве, и d удалить файл.

ВАЖНАЯ ЗАМЕТКА
Не используйте формат 7zip для резервного копирования файловой системы linux, поскольку он не хранит владельца и группу содержащихся файлов.

Он не индексирует, о котором я знаю, но я использую dump & restore с большими файлами, и навигация по дереву восстановления в интерактивном режиме для выбора случайных файлов ОЧЕНЬ быстра.

Есть также . Он сжимает несжатый tar-архив с помощью xz и добавляет индекс в конце. Для любой программы, которая не знает о полученном файле, это всего лишьфайл, поэтому многие программы умеют его читать, но синструмент позволяет просматривать или извлекать файлы или каталоги, не распаковывая весь архив.

Я верю, что GNU tar способен делать то, что вы хотите, но я не могу найти определенный ресурс, говорящий об этом.

В любом случае вам нужен формат архивации с индексом (так как это позволит вам делать то, что вы хотите). Я не верю, что ZIP-файлы могут расти такими большими, к сожалению.

Как говорили другие, большинство форматов архивов, кроме t ar, используют индекс, вы также можете создать внешний индекс для несжатых tar-ов; https://faultserver.ru/a/1023249/254756

Другие вопросы по тегам