Я использую tar
для архивации группы очень больших (несколько ГБ) bz2
файлы.
Если я использую tar -tf file.tar
чтобы вывести список файлов в архиве, это займет очень много времени (~ 10-15 минут).
Точно так же cpio -t < file.cpio
занимает столько же времени, плюс-минус несколько секунд.
Соответственно получение файла из архива (через tar -xf file.tar myFileOfInterest.bz2
например) так же медленно.
Есть ли какой-либо метод архивирования, который поддерживает доступный «каталог» с архивом, чтобы можно было быстро извлечь отдельный файл в архиве?
Например, своего рода каталог, в котором хранится указатель на конкретный байт в архиве, а также размер файла, который нужно получить (а также любые другие специфические особенности файловой системы).
Есть ли инструмент (или аргумент tar
или cpio
), что позволяет эффективно извлекать файл из архива?
tar (а также cpio, afio, pax и аналогичные программы) являются потоковыми форматами - они предназначены для потоковой передачи прямо на ленту или передачи в другой процесс. хотя теоретически можно было бы добавить индекс в конец файла / потока, я не знаю ни одной версии, которая это делает (хотя это было бы полезным улучшением)
он не поможет с вашими существующими архивами tar или cpio, но есть еще один инструмент, dar («дисковый архив»), который действительно создает архивные файлы, содержащие такой индекс, и может предоставить вам быстрый прямой доступ к отдельным файлам в архиве .
если dar не включен в ваш unix / linux-dist, вы можете найти его по адресу:
Для таких архивов вы можете использовать SquashFS. это
Единственный известный мне недостаток - это то, что он доступен только для чтения.
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 и хэши файловых данных.
Торбьёрн Равн Андерсер верно. GNU tar по умолчанию создает архивы с возможностью поиска. Но он не использует эту информацию при чтении этих архивов, если не задана опция -n. С параметром -n я только что извлек файл размером 7 ГБ из архива 300 ГБ за время, необходимое для чтения / записи 7 ГБ. Без -n это заняло больше часа и не дало результата.
Я не уверен, как на это влияет сжатие. Мой архив не был сжат. Сжатые архивы не доступны для "поиска", потому что текущая (1.26) GNU tar передает сжатие внешней программе.
Единственный известный мне формат архива, в котором хранятся индексы, - это ZIP, потому что мне приходилось восстанавливать поврежденные индексы более одного раза.
Он не индексирует, о котором я знаю, но я использую дамп и восстановление для больших файлов, а навигация по дереву восстановления в интерактивном режиме для выбора случайных файлов ОЧЕНЬ быстрая.
Вы можете использовать архив / формат сжатия 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, так как он не хранит владельца и группу содержащихся файлов.
Я верю, что GNU tar может делать то, что вы хотите, но я не могу найти исчерпывающий ресурс, в котором говорится об этом.
В любом случае вам нужен формат архивирования с индексом (поскольку это позволит вам делать то, что вы хотите). Я не верю, что ZIP-файлы, к сожалению, могут вырасти настолько большими.
Как говорили другие, большинство форматов архивов, кроме tar, используют индекс, вы также можете создать внешний индекс для несжатых tar-ов; https://serverfault.com/a/1023249/254756