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

24

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

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

Аналогично, cpio -t < file.cpioдля завершения требуется столько же времени, плюс или минус несколько секунд.

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

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

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

Существует ли инструмент (или аргумент для tarили cpio), который позволяет эффективный поиск файла в архиве?

Алекс Рейнольдс
источник

Ответы:

15

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

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

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

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

саз
источник
Есть ли способ передать извлечение на стандартный вывод? Похоже, есть способ сделать архив из стандартного ввода, но нет способа (по крайней мере, не напрямую) извлечь его в стандартный вывод. Из документации не ясно, есть ли способ сделать это. Вы знаете, как это может быть достигнуто?
Алекс Рейнольдс
1
Нет, не знаю. Я на самом деле не использую дар ... я просто знаю, что он существует. Я достаточно доволен tar и имею тенденцию просто создавать текстовые файлы со списком содержимого больших tar-файлов, которые я, возможно, захочу найти позже. Вы можете сделать это одновременно с созданием архива tar, дважды используя опцию v (например, «tar cvvjf /tmp/foo.tar.bz2 / path / to / backup> /tmp/foo.txt»)
cas
10

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

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

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

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

MauganRa
источник
8

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

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

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

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

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

Приостановлено до дальнейшего уведомления.
источник
+1 за то, что предупредил меня о полезном инструменте звучания, о котором я никогда раньше не слышал.
Cas
Ссылка starне работает ......
Pacerier
5

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

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

Айдас Каспарас
источник
в соответствии с man-страницей tar man7.org/linux/man-pages/man1/tar.1.html , GNU tar по умолчанию будет использовать формат поиска при записи, а если архив будет доступен для поиска, будет использовать его при чтении (для список или выписка). Если вы используете GNU tar и все еще видите проблему, вам следует отправить отчет об ошибке в GNU.
Брайан Минтон
7
Если я правильно прочитал руководство, оно никогда не говорит о том, что оно имеет какой-либо индекс, и может перейти к любому файлу в архиве по заданному имени файла. --seek просто означает, что базовый носитель является доступным для поиска, поэтому, когда он читает с начала, он может пропустить чтение содержимого файла, но ему все равно нужно прочитать заголовки записи с начала. Тем не менее, если у вас есть архив с файлами 1M, и вы пытаетесь извлечь последний, с помощью --no-seek, вам необходимо прочитать содержимое всех файлов; с --seek вам нужно только прочитать 1M заголовков, по одному для каждого файла, но это все еще очень медленно.
icando
4

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

romble
источник
2

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

MediaManNJ
источник
2

Вы можете использовать 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 файловой системы резервного копирования , как это не хранит владельца и группу файлов , содержащихся.

complistic
источник
Для Linux было бы хорошо 7zip файл tar.
Турбьёрн Равн Андерсен
1

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

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

Турбьерн Равн Андерсен
источник
ZIP-файлы могут расти большими .
Pacerier
1
Если я правильно прочитал руководство, оно никогда не говорит о том, что оно имеет какой-либо индекс, и может перейти к любому файлу в архиве по заданному имени файла. --seek просто означает, что базовый носитель является доступным для поиска, поэтому, когда он читает с начала, он может пропустить чтение содержимого файла, но ему все равно нужно прочитать заголовки записи с начала. Тем не менее, если у вас есть архив с файлами 1M, и вы пытаетесь извлечь последний, с помощью --no-seek, вам необходимо прочитать содержимое всех файлов; с --seek вам нужно только прочитать 1M заголовков, по одному для каждого файла, но это все еще очень медленно.
icando
2
@Pacerier Насколько я понимаю, формат ZIP64 допускает очень большие файлы, а оригинальный формат ZIP - нет.
Торбьерн Равн Андерсен
@ ThorbjørnRavnAndersen, один файл размером 4 ГБ - большой чувак.
Pacerier
3
@Pacerier 4GB не был большим, так как DVD ISO появились на сцене почти двадцать лет назад. Террабайт в наши дни большой.
oligofren