2010-08-12 18 views
13

Czy można programowo pobrać pojedynczy plik z przyzwoitego formatu .tar.gz bez rozpakowywania całego archiwum na dysk? Zasadniczo muszę dostać się do dużych plików tar.gz przez sieć i wyodrębnić 1 mały plik tekstowy. Wydaje się nieco przesadzone, aby wyciągnąć i rozpakować archiwum na dysk, a następnie wyciągnąć plik, a następnie usunąć wszystko inne. Również zamierzam robić to rekurencyjnie (np. Zależności w pakietach, każdy plik tekstowy wskazuje na więcej tar.gz), więc im mniej ruchu sieciowego i cykli procesora mogę uciec, tym lepiej.Wyodrębnij 1 plik z tar.gz z bashem

+1

Nie, to bash związane. A bash to programowanie (rodzaj). –

+1

@Matt Joiner: Nie jest tak naprawdę związany z bash. Jest to pytanie o użycie wspólnego narzędzia systemowego, które można wywołać z dowolnej powłoki, a nie tylko z bash. Ale tak, programowanie w bashu jest rzeczywiście programem, pomimo tego, co czasem słyszeliście. – Cascabel

+0

Tak, myślałem o SU, ale znajduje się on w stosunkowo złożonym skrypcie bash i będzie uruchamiany przez maszynę, a nie przez użytkownika, więc pomyślałem, że to trochę więcej niż SO. – tj111

Odpowiedz

21

Od strony człowieka, aby wyodrębnić blah.txt z foo.tar.gz:

tar -xzf foo.tar.gz blah.txt 

(i to idzie na administratora, oczywiście, ale hej, szybkie odpowiedzi są ładne.)

+0

Czy to działa, jeśli plik znajduje się w podkatalogu wewnątrz struktury tar.gz? – tj111

+0

W nowoczesnych wersjach tar GNU, nie musisz określać opcji "z" w ekstrakcie - sama to wywnioskuje (i podobnie z opcją "j" dla skompresowanych plików bzip2). Tworząc plik, potrzebna jest opcja, aby powiedzieć, co tworzyć, aby symetria nie wyrządzała żadnej szkody. –

+1

@ tj111: jeśli nazwa pliku w pliku tar jest "xyz/pqr/abc.txt", to jest to, co określasz w linii poleceń. Możesz również użyć metaznaków w powłoce: 'xyz/pqr/*' wyodrębni wszystkie pliki we wszystkich podkatalogach w 'xyz/pqr'. Tylko bądź ostrożny, czy powłoka rozszerza "*" dla Ciebie - użyj cytatów, aby to powstrzymać. –

4

I echo odpowiedzi Jefromi, z dodaniem włączenia ścieżki do pliku, jeśli masz katalogi w pliku tar (dla niektórych może się to wydawać oczywiste, ale początkowo nie było dla mnie jasne, jak określić strukturę katalogów).

Na przykład, jeśli zrobiłeś tar w katalogu src /, a plik blah.txt był pod adresem release1/shared /, powracasz do katalogu src/(jeśli chcesz, aby był on w tym samym miejscu untarred)

tar -xzf tar.gz release1/shared/blah.txt 

Jeśli nie pamiętają strukturę katalogów dysku pliku tar (jestem trochę chaotyczna, a czasami zapomnieć, gdzie zrobiłem smołę), zawsze można

tar -tzf tar.gz 

zobaczyć zawartość , anulowanie (Ctrl + C), gdy tylko zorientujesz się w strukturze katalogów.

+0

Dzięki za to. Chociaż wydaje się, że potrzebujesz katalogu '. /' Znajdującego się przed katalogami, z dowolnego powodu, aby je przeskanować. na przykład 'tar -xzf tar.gz./release1/shared/blah.txt' – tj111