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.txt
bez rozpakowywania a.tar
.
shell-script
tar
archive
Ramji
źródło
źródło
Odpowiedzi:
Prawdopodobnie jest to opcja specyficzna dla GNU, ale możesz użyć
-O
lub,--to-stdout
aby wyodrębnić pliki na standardowe wyjścieźródło
tar -axf file.tar.gz --wildcards --no-anchored '*read_this_file*' --O
gdy na przykład wiele plików się zgadza*read_this_file*
. Wszystko drukuje się na tej samej linii. Zman
, znalazłem--to-command
. więc przekazywanie--to-command="echo '' && cat"
jest trochę czarną magią, ale działa: D$ tar -axf file.tgz foo/bar -O
Spowoduje to wydrukowanie zawartości ./x/y.txt z a.tar do STDOUT.
tar xfO a.tar ./x/y.txt
źródło
To proste jak
Ta magiczna sztuczka działa, jeśli została
lesspipe
zainstalowana i jeśli zmienna envLESSOPEN
jest zdefiniowana jako| /usr/bin/lesspipe.sh %s
oczekiwana, jeśli poprawnie zainstalowano lesspipe .źródło
lesspipe.sh
prawdopodobnie powinno być preferowane.Och, ale to jest pytanie o zawartość pliku w
tar
pliku. W rzeczywistości w niektórych przypadkach nie jest to takie trudne. Chodzi o to, żetar
plik 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 wierszamidd
skryptów powłoki i które mogły wtar
górę przesyłać strumień urządzeń blokowych. Na tej samej podstawie napisałem kilka wierszy kodu :... do wybierania
tar
pliku w locie i wykonywania wbudowanych przekształceń w składowych plikach tekstowych. Tamcut
pola wskazują na pola 1,2,13 linii danych ograniczonych NUL . Takie rzeczy są łatwe, gdytar
plik zawiera tylko pliki tekstowe, ponieważtar
ograniczniki 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.tar
Format nagłówka wygląda następująco:Zrozum, że istnieje stosunkowo duże nachylenie między względną łatwością obsługi prostych
tar
operacji 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ówtar
typu 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
tar
archiwum 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 standardoweustar
nagłówki, należy przechodzić od nagłówka członka do nagłówka członka, wykonując odczyty zgodnie zsize
polem nagłówka, dopóki nie znajdzie się elementu pasującego do tego dla którego szukasz. Tam wczytajsize
bajty 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ć jegosize
pole 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:
tar
Format 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
tar
plikiem, 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:size
Pole jest rozmiar pliku w oktetów.typeflag
pole jest ustawione tak, aby określać plik typu 1 ( łącze ) lub 2 ( łącze symboliczne ) ,size
pole należy podać jako zero.typeflag
pole jest ustawione tak, aby określać plik typu 5 ( katalog ) ,size
pole należy interpretować zgodnie z opisem pod definicją tego typu rekordu.typeflag
pole ma wartość 3 ( znak specjalny plik) , 4 ( blokowy plik specjalny ) lub 6 ( FIFO ) , znaczenie tegosize
pola nie jest określone w tym tomie POSIX.1-2008 i żadne rekordy logiczne danych nie będą przechowywane na nośniku.size
pole elektromagnetyczne powinny być ignorowane podczas czytania.typeflag
polu 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
tar
s 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
chksum
pola i zweryfikować, że plik, który Twoim zdaniem masz, jest w rzeczywistości plikiem, który chcesz.tar
„schksum
jest dość prosta chociaż-:chksum
Pole 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 kontrolnejchksum
pole jest traktowane tak, jakby to były wszystkie znaki <spacja> .Oczywiście tak naprawdę nie musiałbyś tego robić, ponieważ
tar
moż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ś?źródło
Możesz użyć tej linii
źródło
y.txt
i nie jest jasne z pytania OP, że jest to jedyny plik w tar.