pozwól tar automatycznie wykryć typ kompresji podczas wyciągania ze standardowego wejścia

16

Używam GNU tar. Może automatycznie wykryć typ kompresji podczas kompresji / dekompresji plików. Ale muszę zdekompresować archiwum ze standardowego wejścia i typ kompresji jest nieznany. Zauważyłem, że smoła może dać mi prawidłowe sugestie, takie jak:

tar: Archive is compressed. Use -z option

Chcę jednak, aby tar automatycznie używał tej opcji kompresji bez pytania mnie o podanie tego argumentu. Jak mogę to zrobić? Dlaczego nie tar po prostu rozpakować, ponieważ już zna typ kompresji?

Dziękuję Ci!

James
źródło
Nie było trudno się w nim rozwijać, ale dopiero teraz.
Peter - Przywróć Monikę
3
Powodem, dla którego nie może tego zrobić, jest to, że tarnie wie, jaki typ danych ma na sobie, stdindopóki nie przeczyta, a do tego czasu jest już za późno na wywołanie programu dekompresującego. Obsługuje gzip, bzip2 i inne. Obejście tego problemu nie jest łatwe (musiałoby buforować dane), więc po prostu każe ci spróbować ponownie.
Kevin Panko
@KevinPanko Dlaczego to za późno? Nie, nie jest późno. Odczytuje np. Pierwsze 4K w buforze, testuje typ kompresji (jeśli taki istnieje), a następnie wywołuje program. To buforowanie obejmowało 10-20 linii dodatkowego kodu C.
Peter - Przywróć Monikę
2
W tym momencie, kiedy wie, jakie dane ma, nie może już używać prostych fork()/ exec()metodę rury dane przez rozpakować użyteczności. Narzędzie będzie czytać z stdinpotoku, a teraz będzie brakowało pierwszego 4K. Po odczytaniu danych nie ma możliwości ponownego umieszczenia danych w potoku.
Kevin Panko
3
@KevinPanko: Można to zrobić rozwidlając dwa procesy, w zasadzie wykonując odpowiednik cat buffer - | gunzip. (Alternatywnie, można użyć nieblokujących wejść / wyjść, aby uniknąć konieczności dodatkowego procesu.)
Ilmari Karonen,

Odpowiedzi:

10

To nie jest odpowiedź, którą chcesz usłyszeć, ale nie jest obsługiwana przez GNU tar zgodnie z jego instrukcją:

Jedynym przypadkiem, w którym należy określić opcję dekompresji podczas czytania archiwum, jest odczytywanie z potoku lub napędu taśmowego, który nie obsługuje dostępu losowego. Jednak w tym przypadku tar tar GNU wskaże, której opcji należy użyć. Na przykład:

$ cat archive.tar.gz | tar tf -
tar: Archive is compressed.  Use -z option
tar: Error is not recoverable: exiting now

Jeśli widzisz taką diagnostykę, po prostu dodaj sugerowaną opcję do wywołania tar GNU:

$ cat archive.tar.gz | tar tzf -

- 8.1.1 Tworzenie i czytanie skompresowanych archiwów

Kevin Panko
źródło
2
Zauważ, że działa to w poleceniu tar w OSX, ale nie w systemie Linux przy użyciu GNU tar. Więc można to naprawić.
Sean Perry,
8

Wreszcie zdałem sobie sprawę, że nie mogę pozwolić tarowi wykrywać i dekompresować archiwum ze standardowego wejścia, ponieważ używam tar GNU. Tar BSD może to zrobić automatycznie bez problemu. Więc zdecydowałem się teraz używać bsdtar zamiast tar w moim skrypcie.

James
źródło