wyodrębnij pojedynczy plik z ogromnego pliku tgz

19

Mam ogromny plik tar (około 500G) i nie chcę z niego wyciągać ani jednego pliku.
Jednak po uruchomieniu tar -xvf file.tgz path/to/filewydaje się, że wciąż ładuje całą zawartość do pamięci i rozpakowanie zajmuje ponad godzinę. Próbowałem również użyć --exclude=ignore.txtgdzie ignore.txt jest listą wzorców, próbując powstrzymać ją przed przemierzaniem daremnych ścieżek, ale to nie działa.

Być może nie rozumiem tar ... Czy istnieje sposób na szybkie rozpakowanie pliku?

Brian
źródło
Zastanawiam się nad tym samym. Plik, którego szukam, jest szybko znajdowany i rozpakowywany - a następnie muszę poczekać godzinę na przetworzenie pozostałej części osiągnięcia: o (
maasha

Odpowiedzi:

14

Niestety, aby rozpakować jednego członka .tar.gzarchiwum, musisz przetworzyć całe archiwum i niewiele możesz zrobić, aby to naprawić.

To tutaj .zip(i niektóre inne formaty, takie jak .rar) archiwa działają znacznie lepiej, ponieważ zipformat ma centralny katalog wszystkich plików w nim zawartych, z bezpośrednimi przesunięciami wskazującymi na środek zippliku, dzięki czemu członkowie archiwum można szybko wyodrębnić bez przetwarzania całej rzeczy.

Możesz zapytać, dlaczego przetwarzanie .tar.gzjest tak wolne?

.tar.gz(często skracany jako .tgz) to po prostu .tararchiwum skompresowane za pomocą gzipkompresora. gzipto kompresor strumieniowy, który może działać tylko z jednym plikiem. Jeśli chcesz uzyskać dowolną część gzipstrumienia, trzeba rozpakować go jako całość, a to co naprawdę zabija go .tar.gz(i .tar.bz2, .tar.xzi innych podobnych formatów na podstawie .tar).

.tarformat jest w rzeczywistości bardzo, bardzo prosty. Jest to po prostu strumień 512-bajtowych nagłówków plików lub katalogów (nazwa, rozmiar itp.), Po których następuje zawartość pliku lub katalogu (w razie potrzeby uzupełniona do rozmiaru bloku 512 bajtami 0). Kiedy zaobserwujesz całkowicie zerowy blok 512 dla nagłówka, oznacza to koniec .tararchiwizacji.

Niektórzy uważają, że nawet .tarczłonkowie archiwum nie mogą uzyskać szybkiego dostępu, ale nie jest to do końca prawdą. Jeśli .tararchiwum zawiera kilka dużych plików, faktycznie możesz szybko wyszukać następny nagłówek, a zatem możesz znaleźć niezbędnego członka archiwum w kilku poszukiwaniach (ale nadal może wymagać tyle wyszukiwań, ile jest członków archiwum). Jeśli twoje .tararchiwum zawiera wiele małych plików, oznacza to, że szybkie pobieranie członków staje się praktycznie niemożliwe nawet dla nieskompresowanych .tar.

mvp
źródło
3
gzip może przesyłać strumieniowo nieskompresowane dane, nie musi cofać całej operacji. Ponieważ jednak .tar jest skrótem od archiwizacji taśm, musisz przeglądać cały plik, aż znajdziesz szukany plik. Chociaż tar będzie szukał dalej, ponieważ może być inny, później skopiuj go później w pliku tar.
kurtm
9

Jeśli wyodrębniasz tylko jeden plik z dużego pliku tar, używasz GNU tar, i możesz zagwarantować, że plik tar nigdy nie został dołączony, wtedy możesz uzyskać znaczny wzrost wydajności, używając --occurrence.

Ta opcja mówi tarowi, aby zatrzymał się, gdy tylko znajdzie pierwsze wystąpienie każdego żądanego pliku, np

tar xf large-backup.tar --occurrence etc/passwd etc/shadow

nie będzie buforować całego archiwum po znalezieniu jednej kopii każdego z nich passwdi shadowzamiast tego zatrzyma się. Jeśli te pliki pojawią się pod koniec, wzrost wydajności nie będzie duży, ale jeśli pojawią się nawet w połowie pliku 500G, zaoszczędzisz dużo czasu.

Dla osób korzystających tarz kopii zapasowych pojedynczych ujęć i nieużywających prawdziwych napędów taśmowych taka sytuacja jest prawdopodobnie typowym przypadkiem.

Pamiętaj, że możesz również przekazać, --occurrence=NUMBERaby pobrać LICZBĄ liczbę wystąpień każdego pliku, co pomaga, jeśli wiesz, że w archiwum znajduje się wiele wersji. Domyślnie zachowanie jest równe NUMBER1.

phogg
źródło
Czy istnieje sposób na utworzenie tar, aby pierwszy plik pojawił się jako pierwszy? żeby --occurrenceto natychmiast uruchomiło pierwszy plik? Zgaduję, że chodzi o nazwy plików, więc na przykład najpierw pojawi się coś o nazwie aaaaa.jpg?
Jeff
1
@Jeff: Nie bardzo. To po prostu uniemożliwia tardalsze wyszukiwanie w archiwum tar w poszukiwaniu nowszych wersji znalezionego pliku. Zamiast tego zwraca, ponieważ strona mężczyzna mówi the Nth occurrence. Jeśli podasz jeden plik do wypakowania w wierszu poleceń i powiesz, że --occurrencetar zakończy działanie, gdy tylko znajdzie ten plik, a tym samym skutecznie zatrzyma się na „pierwszym pliku”.
phogg
2

W przypadku dużego użycia tarballa:

--fast-readaby wyodrębnić tylko pierwszy wpis archiwum pasujący do operandu nazwy pliku, path/to/filew tym przypadku - który jest zawsze unikalny w tarballu

tar -xvf file.tgz --fast-read path/to/file

powyższe będzie wyszukiwać, aż znajdzie dopasowanie, a następnie zakończy działanie

Ryan
źródło
1
Chciałem zrozumieć, dlaczego wciąż jest to 0 punktów. man tar(GNU tar 1.29) nawet nie drukuje tej opcji. Wydaje się jednak, że Ubuntu ma domyślnie włączone . Czytając szybko, nie jestem pewien, co --fast-readrobi inaczej --occurrence. Ale --occurrenceto nie jest nawet na stronie Ubuntu, ale jest w man tar. Czy --fast-readi --occurrenceto samo może być?
Jeff
Żadna z tych opcji nie jest określona przez standard i, jak zawsze w przypadku niestandardowych opcji, należy zachować ostrożność, aby upewnić się, że narzędzie w systemie je obsługuje. Opcja --occurrences jest obsługiwana przez GNU tar. Opcja --fast-read jest obsługiwana przez najnowsze wersje tar FreeBSD, spakowane jako Ubuntu jako bsdtar. Zobacz tutaj po więcej.
phogg
1

Niestety format pliku tar nie zawiera scentralizowanego spisu treści - archiwum należy więc odczytywać kolejno, aby zlokalizować konkretny plik. Pierwotnie był on przeznaczony dla kopii zapasowych na taśmach ( „smoła” pochodzi od t małpa ar szczypiorek), który nie byłby obsługiwany takiej operacji w każdym przypadku.

Więc prawdopodobnie będziesz musiał tylko poczekać.

użytkownik55325
źródło