Jak wyodrębnić pojedynczy folder z dużego archiwum tar.gz?

131

Używam tego polecenia w archiwum 5 GB

tar -zxvf archive.tar.gz /folder/in/archive

czy to jest właściwy sposób to zrobić? Wydaje się, że trwa to wiecznie bez wyjścia z wiersza poleceń ...

Garrett Hall
źródło
Czy użyłeś ścieżki bezwzględnej lub względnej? Powinien być względny, poza tym wygląda dobrze. Jak długo pozwoliłeś mu działać i jak dobry jest twój system? Szybka maszyna zajmie co najmniej kilka minut. Potencjalnie godzinę lub dłużej? Teraz przeprowadzam test.
Kevin
Tak, zakończyło się po ~ 1 godzinie, ale absolutna ścieżka była zła, miałeś rację.
Garrett Hall
5
W systemie Linux, można obserwować, jak daleko w archiwum tarjest z cat /proc/$(pidof tar)/fdinfo/0(dostosować komendy, jeśli masz więcej niż jeden tarbieg procesu).
Gilles
Ważną częścią jest również brak końcowego cięcia. Korzystanie folder/folder2/nie działa.
Marki555

Odpowiedzi:

145

tardomyślnie przechowuje ścieżki względne . GNU tar nawet tak mówi, jeśli spróbujesz zapisać ścieżkę bezwzględną:

tar -cf foo.tar /home/foo
tar: Removing leading `/' from member names

Jeśli chcesz wyodrębnić określony folder, spójrz na zawartość pliku tar:

tar -tvf foo.tar

I zanotuj dokładną nazwę pliku. W przypadku mojego foo.tarpliku mogę wyodrębnić /home/foo/bar, mówiąc:

tar -xvf foo.tar home/foo/bar # Note: no leading slash

Więc nie, sposób, w jaki napisałeś, nie jest (koniecznie) prawidłowym sposobem na zrobienie tego. Musisz pominąć wiodący ukośnik. Jeśli chcesz symulować ścieżki bezwzględne, zrób to cd /najpierw i upewnij się, że jesteś superużytkownikiem. To samo robi to samo:

tar -C / -xvf foo.tar home/foo/bar # -C is the ‘change directory’ option

Istnieją bardzo oczywiste, dobre powody, dla których tarzamienia ścieżki na względne. Jedną z nich jest możliwość przywrócenia archiwum w miejscach innych niż oryginalne źródło. Drugi to bezpieczeństwo. Możesz wyodrębnić archiwum, oczekiwać, że jego pliki pojawią się w bieżącym katalogu roboczym, i zamiast tego przez pomyłkę zastąpić pliki systemowe (lub własną pracę) w innym miejscu.

Uwaga: W przypadku korzystania z -Popcji tar będzie archiwizować ścieżki bezwzględnej. Dlatego zawsze warto sprawdzić zawartość dużych archiwów przed rozpakowaniem.

Alexios
źródło
36
--strip-components=Nmogą być przydatne niektórym tutaj.
Acumenus
2
w moim przypadku konieczne było napisanie ./foldername/zamiast foldername, wydaje mi się, że było tak, ponieważ kiedy stworzyłem smołę, stworzyłem ją, tar -cvf santi.tar ./*a kiedy „wymieniłem” smołę, oto, co napisanodrwxr-xr-x santi/santi 0 2016-04-11 09:42 ./foldername/
santiago arizti
1
Io .gz?
Peter Krauss,
1
@PeterKrauss zmieni się -xvfna -xzvf(dodanie -zopcji) i oczywiście foo.tarna foo.tar.gzlub jakkolwiek się nazywa twoje archiwum. To samo dotyczy -j(bz2) i niektórych najnowszych wersji -J(xz). W przeciwnym razie zcat foo.tar.gz | tar -xvf - …działa również taki potok .
Alexios
I pamiętaj, jeśli jesteś zmęczony wyczerpującą produkcją podczas ekstrakcji, po prostu pomiń vwszystkie przykłady. Na przykład, tar -tf foo.tari tar -xf foo.tar ....
Bo R