Jak wyodrębnić określone pliki z tar.gz


104

Jak możemy wyodrębnić określone pliki z dużego pliku tar.gz? W tym pytaniu znalazłem proces wyodrębniania plików ze tar, ale kiedy wypróbowałem tam wspomniane polecenie, dostałem błąd:

$ tar --extract --file={test.tar.gz} {extract11}
tar: {test.tar.gz}: Cannot open: No such file or directory
tar: Error is not recoverable: exiting now

Jak wyodrębnić plik tar.gz?


Pamiętaj, że każde rozwiązanie musi najpierw rozpakować całe archiwum: superuser.com/questions/655739/... Jeśli chcesz tego uniknąć, musisz użyć innego formatu, takiego jak zip. ZIP zapewni jednak mniejszą kompresję, ponieważ oddzielnie kompresuje pojedynczy plik: superuser.com/questions/1013309/ ... Zastanawiam się, czy istnieje format obsługujący zarówno szybkość, jak i możliwość wyodrębnienia pojedynczego pliku.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Odpowiedzi:


119

Możesz także użyć tar -zxvf <tar filename> <file you want to extract>

Musisz napisać dokładną nazwę pliku, jak tar ztf test.tar.gzto pokazuje. Jeśli mówi np. ./extract11Lub some/bunch/of/dirs/extract11, właśnie to musisz podać (a plik pojawi się pod dokładnie taką nazwą, potrzebne katalogi są tworzone automatycznie).

  • -x: nakazuje tarowi wypakowanie plików.
  • -f: określa nazwę pliku / nazwy pliku tarball.
  • -v: Pełne (pokaż postęp podczas rozpakowywania plików).
  • -z: filtruj archiwum przez gzip, użyj do dekompresji plików .gz.

$ tar -zxvf test.tar.gz extract11 tar: extract11: Not found in archive tar: Error exit delayed from previous errors
Ankit Vashistha

1
następnie spróbuj tego. tar tf archive.tar.gz | grep extract11proszę sprawdź, czy ekstrakt11 jest w archiwum czy nie
harish.venkat

8
Musisz napisać dokładną nazwę pliku, jak tar ztf test.tar.gzto pokazuje. Jeśli mówi np. ./extract11Lub some/bunch/of/dirs/extract11, właśnie to musisz podać (a plik pojawi się pod dokładnie taką nazwą, potrzebne katalogi są tworzone automatycznie).
vonbrand

Chciałbym tutaj dodać punkt, -zopcja nie działa w niektórych wersjach Uniksa, takich jak HP-UX.
Ankit Vashistha

1
@ pj-brunet: Nie, fnie może być na końcu. Ale bezpośrednio po nim musi być nazwa pliku. Ten przykład z wszystkich innych opcji po nazwie smoły działa dobrze: tar -f mytar.tar.gz -zxv dir/somefile. Wyodrębnia „dir / somefile” z „mytar.tar.gz”.
mivk

34

Załóżmy, że masz wywoływany plik tarball lotsofdata.tar.gzi wiesz, że jest tam jeden plik, który chcesz, ale wszystko, co pamiętasz, to jego nazwa contract. Masz dwie opcje:

Użyć tari grepnotować zawartość swojego archiwum, dzięki czemu można dowiedzieć się pełną ścieżkę i nazwę wszystkich plików pasujących część znasz, a następnie użyć tar, aby wyodrębnić, że jeden plik teraz wiesz swoje dokładne dane, czy można korzystać z dwóch mało znane przełączniki, aby wyodrębnić wszystkie pliki, które pasują do tego, co niewiele wiesz o nazwie pliku - nie musisz znać pełnej nazwy ani żadnej części jej ścieżki dla tej opcji. Szczegóły są następujące:

opcja 1

$ tar -tzf lotsofdata.tar.gz | grep contract

Spowoduje to wyświetlenie szczegółów wszystkich plików, których nazwy zawierają znaną część. Następnie wyodrębnij to, czego chcesz, używając:

$ tar -xzf lotsofdata.tar.gz <full path and filename from your list above>

Może być konieczne, ./aby Twoja ścieżka działała.

Opcja 2

$ tar -xzf lotsofdata.tar.gz --wildcards --no-anchored '*contract*'

Do Ciebie, które uważasz za łatwiejsze lub najbardziej przydatne.


Drat. Literówka na temat ostatniego polecenia: zduplikowałem -xzf. Powinna istnieć tylko jedna instancja tych przełączników.
Wendy Cricks,

tar -xzf lotsofdata.tar.gz <full path and filename from your list above>pracował dla mnie ./z naszym dawaniem na początku pełnej ścieżki
13107

Być może będziesz musiał być cierpliwy, poświęcić trochę czasu ... Może to oczywiste, ale wyodrębni pełną strukturę katalogów w bieżącym katalogu, nawet jeśli te katalogi jeszcze nie istnieją.
PJ Brunet

Tar BSD (przynajmniej w systemie macOS) nie obsługuje tej --wildcardsopcji. Nadal byłem w stanie uzyskać podobne zachowanie -x -O *foo. *foow moim przypadku był glob globu nazw plików, ponieważ wiedziałem, że plik zakończył się na foo.
Eric Hu

6

Próbowałem wyodrębnić kilkaset plików z tarballa z tysiącami plików innego dnia. Pliki, których potrzebuję, nie mogą być przywoływane przez pojedynczą symbol wieloznaczny. Więc przejrzałem i znalazłem tę stronę.

Żadna z powyższych sztuczek nie wydaje się jednak odpowiednia do mojego zadania. Skończyło się na czytaniu mężczyzny i znalazłem tę opcję --files-from, więc moim ostatecznym rozwiązaniem jest

gunzip < thousands.tar.gz | tar -x -v --files-from hundreds.list -f -

i działa jak urok.

Aktualizacja: plik listy powinien mieć taki sam format, jak można zobaczyć tar -tvf, w przeciwnym razie nie będzie można wyodrębnić żadnych plików.


2

Twój przykład działa dla mnie, jeśli pominiesz nawiasy klamrowe

$ tar --extract --file=test.tar.gz extract11

Jeśli plik ekstrakt11 znajduje się w podfolderze, powinieneś określić ścieżkę w pliku archiwum.

$ tar --extract --file=test.tar.gz subfolder/extract11

$ tar --extract --file=test.tar.gz extract11 tar: extract11: Not found in archive tar: Error exit delayed from previous errors
Ankit Vashistha

Zatem, oczywiście, wyciąg 11 nie znajduje się w pliku tar. Upewnij się, że musisz podać ścieżkę względną. Zobacz edycję
Bernhard

1

Poniżej znajdują się przykłady wyodrębniania określonych plików z pliku tar.gz.

Z pliku lokalnego:

$ tar xvf file.tgz path/README.txt 2nd_file.txt

Ze zdalnego adresu URL:

$ curl -s http://example.com/file.tgz | tar xvf - path/README.txt 2nd_file.txt
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.