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

9

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

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

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

Саиф
источник
1
Вы забыли -zвариант: tar -tvfz. Аналогично: что произойдет, если вы используете команду tar tvf вместо tar tvfz?
smci
3
@smci: это автоматически определяется, так что не совсем забыто.
Ry-

Ответы:

14

Файлы 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

Зип здесь медленнее.

Тест 2

Каталог, files2содержащий 5000 файлов с 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содержащий 5000 файлов с 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 вносит небольшие накладные расходы, которые вы заметите только со многими очень маленькими (почти пустыми) файлами, тогда как для большого количества больших файлов он выигрывает конкурс при перечислении файлов, содержащихся в архиве.

Себастьян Старк
источник