Wyświetl plik w archiwum tar bez rozpakowywania go


16

Chcę wyświetlić zawartość pliku smołowego bez wypakowywania go, scenariusz: mam plik a.tar, a w środku znajduje się plik o nazwie ./x/y.txt. Chcę zobaczyć zawartość y.txtbez rozpakowywania a.tar.


Jeśli używasz Emacsa, możesz po prostu otworzyć w nim archiwum.
Qudit,

Eee, aby go zobaczyć, musisz go wyodrębnić. Myślę, że masz na myśli „bez zapisywania go do pliku”?
Toby Speight,

Odpowiedzi:


20

Prawdopodobnie jest to opcja specyficzna dla GNU, ale możesz użyć -Olub, --to-stdoutaby wyodrębnić pliki na standardowe wyjście

$ tar -axf file.tgz foo/bar -O

Ach działa, ale nie udało mi się wydrukować wyników na nowych liniach. dawny; tar -axf file.tar.gz --wildcards --no-anchored '*read_this_file*' --Ogdy na przykład wiele plików się zgadza *read_this_file*. Wszystko drukuje się na tej samej linii. Z man, znalazłem --to-command. więc przekazywanie --to-command="echo '' && cat"jest trochę czarną magią, ale działa: D
GabLeRoux

Jest to potrzebne w odpowiedzi:$ tar -axf file.tgz foo/bar -O
user1742529

12

Spowoduje to wydrukowanie zawartości ./x/y.txt z a.tar do STDOUT.

tar xfO a.tar ./x/y.txt


2
wskazówka: to wielkie „o”, a nie zero.
Hubert Grzeskowiak,

4

To proste jak

less  a.tar:./x/y.txt

Ta magiczna sztuczka działa, jeśli została lesspipezainstalowana i jeśli zmienna env LESSOPENjest zdefiniowana jako | /usr/bin/lesspipe.sh %soczekiwana, jeśli poprawnie zainstalowano lesspipe .


To niesamowity skrypt - ale jest więcej niż jeden. Jak rozumiem, tolesspipe.sh prawdopodobnie powinno być preferowane.
mikeserv

Czy to zadziała na skompresowanych plikach tar?
terdon

Powinno. Ale właśnie odkryłem, że nie działa w Ubuntu. Domyśl. Zniszczyli lub usunęli tę funkcję. Nadal możesz przeglądać listę archiwów z mniejszą, ale nie
zawartą

2

Och, ale to jest pytanie o zawartość pliku w tarpliku. W rzeczywistości w niektórych przypadkach nie jest to takie trudne. Chodzi o to, że tarplik jest po prostu zablokowanym plikiem strumieniowym - każdy plik w archiwum znajduje się po pliku przed nim, a każdy plik otrzymuje nagłówek metadanych oparty na określonym formacie .

Opierając się na tym formacie, napisałem kiedyś shitar- który był kilkoma wierszami ddskryptów powłoki i które mogły w targórę przesyłać strumień urządzeń blokowych. Na tej samej podstawie napisałem kilka wierszy kodu :

tar --no-recursion -c ./      |
{ printf \\0; tr -s \\0; }    |
cut -d '' -f-2,13             |
tr '\0\n' '\n\t'

... do wybierania tarpliku w locie i wykonywania wbudowanych przekształceń w składowych plikach tekstowych. Tam cutpola wskazują na pola 1,2,13 linii danych ograniczonych NUL . Takie rzeczy są łatwe, gdy tarplik zawiera tylko pliki tekstowe, ponieważ tarograniczniki rekordów (co może się zdarzyć raz na 512 bajtów) można po prostu zmniejszyć do jednego NUL na i usunąć - bez konieczności liczenia wystąpień tak jak Ty.

tarFormat nagłówka wygląda następująco:

field    offset   len
name     0        100
mode     100      8
uid      108      8
gid      116      8
size     124      12
mtime    136      12
chksum   148      8
typeflag 156      1
linkname 157      100
magic    257      6
version  263      2
uname    265      32
gname    297      32
devmajor 329      8
devminor 337      8
prefix   345      155

Zrozum, że istnieje stosunkowo duże nachylenie między względną łatwością obsługi prostych taroperacji a znacznie bardziej skomplikowanymi aspektami formatu archiwum. Podczas gdy proste rzeczy - takie jak spakowanie niewielkiej grupy jednorodnie wpisanych plików lub nawet podzielenie archiwum zawierającego tylko elementy, których typy można przewidzieć - można łatwo wykonać za pomocą kilku potoków powłoki, niezawodna obsługa dowolnych elementów archiwum nie jest drobnostką.

Jest to szczególnie trudne, gdy członkowie ci mogą zawierać dowolne dane binarne - co z pewnością uniemożliwiałoby jakiekolwiek niezawodne zastosowanie tr -s- i trudność ta się komplikuje tylko wtedy, gdy używane są pliki różnych typów niż zwykłe i / lub zestawy znaków inne niż Twój i / lub oryginalne archiwum zostało utworzone przez implementację z specyfikacjami aplikacji formatu, których nie jesteś przygotowany do obsługi. Dotyczy to tylko podstawowych, znormalizowanych aspektów tartypu archiwum - dodaj rozszerzone nagłówki i rozszerzenia formatu oraz rzadkie pliki i kompresję i ... no cóż, powodzenia z nimi.

Wracając jednak do podstaw, standardowy rozmiar rekordu dla tararchiwum to 20 bloków - lub 10240 bajtów. Biorąc pod uwagę, że archiwum jest zablokowane na standardowym rozmiarze rekordu i zawiera tylko standardowe typy plików i standardowe ustarnagłówki, należy przechodzić od nagłówka członka do nagłówka członka, wykonując odczyty zgodnie z sizepolem nagłówka, dopóki nie znajdzie się elementu pasującego do tego dla którego szukasz. Tam wczytaj sizebajty z przesunięcia rozpoczynającego się na końcu nagłówka elementu docelowego. I to twój plik.

Jednak przeskakiwanie nagłówków nie jest strasznie łatwe. Różne typy będą albo nie będą miały dołączonych faktycznych bloków danych, które odpowiadają size. Na przykład katalogi i łącza nie będą zawierały takiego bloku danych, tylko opis nagłówka, więc musisz być przygotowany do zweryfikowania typu pliku bieżącego nagłówka przed upewnieniem się, czy powinieneś zastosować jego sizepole do formuły pominięcia, czy nie.

Ponadto czynniki związane z rozmiarem rekordu - w zależności od tego, czy rozmiary członków archiwum są dobrze zsynchronizowane ze standardowym rekordem 10240 - rozmiar może być dołączony do każdego dodatkowego bloku 0 lub nie. A rekord może zostać uznana -size w momencie tworzenia archiwum - a więc nie może być nawet 20 bloków wcale, chociaż, według specyfikacji, to zawsze musi być zablokowane w jednostkach 512-bajtowych:

  • ustar
    • tarFormat wymiany; patrz sekcja OPIS ROZSZERZONY . Domyślny rozmiar bloków dla tego formatu dla specjalnych plików archiwów to 10240 . Implementacje obsługują wszystkie wartości wielkości bloku mniejsze lub równe 32256, które są wielokrotnościami 512 .

Więc jeśli pracujesz z tarplikiem, który może zawierać pliki, które mogą zawierać dowolne dane binarne, musisz przejść przez plik algorytmicznie i zgodnie z typem pliku. Specyfikacja mówi:

  • sizePole jest rozmiar pliku w oktetów.
    • Jeżeli typeflagpole jest ustawione tak, aby określać plik typu 1 ( łącze ) lub 2 ( łącze symboliczne ) , sizepole należy podać jako zero.
    • Jeżeli typeflagpole jest ustawione tak, aby określać plik typu 5 ( katalog ) , sizepole należy interpretować zgodnie z opisem pod definicją tego typu rekordu.
    • Żadne logiczne rekordy danych nie są przechowywane dla typów 1 , 2 lub 5 .
    • Jeśli typeflagpole ma wartość 3 ( znak specjalny plik) , 4 ( blokowy plik specjalny ) lub 6 ( FIFO ) , znaczenie tego sizepola nie jest określone w tym tomie POSIX.1-2008 i żadne rekordy logiczne danych nie będą przechowywane na nośniku.
    • Dodatkowo, dla typu 6 , sizepole elektromagnetyczne powinny być ignorowane podczas czytania.
  • Jeśli w typeflagpolu ustawiono inną wartość, liczba rekordów logicznych zapisanych po nagłówku wynosi , ignorując ułamek wynikający z podziału.( (size+ 511 ) / 512 )

... i oczywiście biorąc pod uwagę także indywidualny rozmiar każdego nagłówka - co stanowi dodatkowy blok na element. Możesz więc przejść do odczytu przez odczyt z nagłówka do nagłówka, aż dojdziesz do jednego pasującego do szukanego nagłówka, w którym to momencie musisz sprawdzić, czy bieżący rekord opisuje jedynie link do pliku lub do rzeczywistego pliku . Jest to szczególnie istotne, ponieważ gdy ten sam plik jest dodawany do archiwum wiele razy, wiele tars będzie zawierać tylko nagłówki linków, ponieważ rzeczywiste dane pliku można już znaleźć gdzie indziej w archiwum.

Po sprawdzeniu, że musisz zastosować swoje obliczenia do chksumpola i zweryfikować, że plik, który Twoim zdaniem masz, jest w rzeczywistości plikiem, który chcesz. tar„s chksumjest dość prosta chociaż-:

  • cksum
    • chksumPole powinno być ISO / IEC 646: 1991 norma IRV reprezentację ósemkowej wartości prostej sumy wszystkich oktetów w nagłówku rekordu logicznego. Każdy oktet w nagłówku należy traktować jako wartość bez znaku. Wartości te należy dodać do liczby całkowitej bez znaku, zainicjowanej na zero, której dokładność nie jest mniejsza niż 17 bitów. Przy obliczaniu sumy kontrolnej chksumpole jest traktowane tak, jakby to były wszystkie znaki <spacja> .

Oczywiście tak naprawdę nie musiałbyś tego robić, ponieważ tarmożesz już to zrobić - tak właśnie działa - dlatego prawdopodobnie powinieneś po prostu użyć go do przeszukania archiwum i wyodrębnienia pliku za Ciebie. Czyniąc to, nie zrobi nic inaczej niż zrobiłbyś, gdybyś wiedział, o co ci chodzi, poza tym, że prawdopodobnie zrobi to lepiej i szybciej, ponieważ taka jest jego praca. A zresztą dlaczego miałbyś?


0

Możesz użyć tej linii

tar -axf a.tar -O

3
To pokaże każdy plik znajdujący się w tar, nie tylko y.txti nie jest jasne z pytania OP, że jest to jedyny plik w tar.
Anthon
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.