Czy tar -tvf dekompresuje plik, czy po prostu wyświetla nazwy?

9

Mam tar.gzplik 32 GB. Próbowałem wyodrębnić z niego określone foldery, więc wymieniłem zawartość za pomocą następującego polecenia, aby wyświetlić strukturę plików:

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

Wydaje się, że lista wszystkich plików trwa wieczność. Moje pytanie brzmi: czy flaga -t wyodrębnia również pliki? Wiem, że nie wyodrębnia się z dysku, ale czas, jaki zajmuje, sprawia, że ​​zastanawiam się, czy faktycznie przetwarza je w jakimś buforze.

Saif
źródło
3
@smci: Jest wykrywany automatycznie, więc tak naprawdę nie zapomniany.
Ry-

Odpowiedzi:

14

Pliki tar.gz nie mają indeksu. W przeciwieństwie do zip lub innych formatów archiwów uzyskanie listy zawartych plików lub innych metadanych nie jest trywialne ani tanie. Aby pokazać, które pliki są zawarte w archiwum, tar rzeczywiście musi rozpakować archiwum i wyodrębnić pliki, chociaż w przypadku -topcji robi to tylko w pamięci.

Jeśli częstym wzorcem w twoim przypadku użycia jest lista plików zawartych w archiwum, możesz rozważyć użycie formatu archiwum, który może dodać indeks pliku do skompresowanego pliku, np. Zip.

Być może chcesz także przyjrzeć się formatowi HDF5 , aby uzyskać bardziej złożone scenariusze.

Pomiary

Po prostu musiałem wykonać kilka pomiarów, aby udowodnić moją odpowiedź, i utworzyłem kilka katalogów z wieloma plikami i spakowałem je, które oba, tar czf files#.tgz files#i zip -r files#.zip files#.

Do testów dwukrotnie uruchomiłem polecenie rozpakowywania i wziąłem wynik drugiego uruchomienia, aby uniknąć pomiaru prędkości dysku.

Test 1

Katalog files1zawierający 100 000 pustych plików .

$ 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 jest tutaj wolniejszy.

Test 2

Katalog files2zawierający 5000 plików z 512 bajtami losowych danych każdy.

$ 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

Nadal nie przekonuje, ale tym razem zip jest szybszy.

Test 3

Katalog files3zawierający 5000 plików z 5kB losowych danych każdy.

$ 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

W tym teście widać, że im większe pliki, tym trudniej jest je wymienić.

Wniosek

Dla mnie wygląda na to, że zip wprowadza niewielki narzut, który zauważysz tylko przy wielu bardzo małych (prawie pustych) plikach, podczas gdy dla dużej liczby większych plików wygrywa konkurs, wymieniając pliki zawarte w archiwum.

Sebastian Stark
źródło