Действительно смолит-tvf, распаковывают файл или просто перечисляют имена?

У меня есть a tar.gz файл 32 ГБ. Я пытался извлечь определенные папки из него так, я перечислил содержание со следующей командой для просмотра структуры файлов:

tar -tvf file.tar.gz > files.txt

Это, кажется, берет навсегда для списка всех файлов. Моим вопросом является-t, отмечает, извлекают файлы также? Я знаю, что это не извлекает на диске, но количестве времени, которое это занимает, заставляет меня задаться вопросом, обрабатывает ли это на самом деле их в своего рода буфер.

9
задан 14 May 2018 в 21:20

1 ответ

файлы tar.gz не имеют индекса. В отличие от zip или других форматов архива это не тривиально, ни дешево получить список содержавших файлов или других метаданных. Чтобы показать Вам, какие файлы содержатся в архиве, tar действительно должен распаковать архив и извлечь файлы, хотя в случае -t опция это делает так только в памяти.

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

Возможно, Вы также хотите смотреть на формат HDF5 для более сложных сценариев.

Измерения

Я просто должен был сделать некоторые измерения для доказательства моего ответа и создал некоторые каталоги со многими файлами в них и упаковал их который оба, tar czf files#.tgz files# и zip -r files#.zip files#.

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

Тест 1

Каталог files1 содержа 100 000 пустых файлов.

$ time tar tzf files1.tgz >/dev/null
tar tzf files1.tgz > /dev/null  0,56s user 0,09s system 184% cpu 0,351 total
$ time unzip -l files1.zip >/dev/null
unzip -l files1.zip > /dev/null  0,30s user 0,34s system 99% cpu 0,649 total

zip медленнее здесь.

Тест 2

Каталог files2 содержа 5 000 файлов с 512 байтами случайных данных каждый.

$ time tar tzf files2.tgz >/dev/null
tar tzf files2.tgz > /dev/null  0,14s user 0,03s system 129% cpu 0,131 total
$ time unzip -l files2.zip >/dev/null
unzip -l files2.zip > /dev/null  0,03s user 0,06s system 98% cpu 0,092 total

Все еще убеждение, но zip быстрее на этот раз.

Тест 3

Каталог files3 содержа 5 000 файлов с 5 КБ случайных данных каждый.

$ time tar tzf files3.tgz >/dev/null
tar tzf files3.tgz > /dev/null  0,42s user 0,03s system 111% cpu 0,402 total
$ time unzip -l files3.zip >/dev/null
unzip -l files3.zip > /dev/null  0,03s user 0,06s system 99% cpu 0,093 total

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

Заключение

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

14
ответ дан 23 November 2019 в 04:55

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

Похожие вопросы: