15%

Zaoszczędź 15% na wszystkich usługach hostingowych

Sprawdź swoje umiejętności i zdobądź Rabat na dowolny plan hostingowy

Użyj kodu:

Skills
Rozpocznij
08.10.2024

Jak wyodrębnić pliki .tar.gz za pomocą wiersza poleceń Linux

Plik .tar.gz to skompresowane archiwum utworzone przez połączenie dwóch odrębnych operacji: tar (Tape Archive), który łączy wiele plików i katalogów w jedno archiwum, oraz gzip, który kompresuje to archiwum w celu zmniejszenia jego rozmiaru. Wynikiem jest przenośny, oszczędny pod względem miejsca format pakietu, który jest de facto standardem dystrybucji oprogramowania, pakietów konfiguracyjnych i kopii zapasowych systemu w praktycznie każdym środowisku Linux i Unix.

Kanonicznym poleceniem do wyodrębniania archiwum .tar.gz jest `tar -xzvf archive-name.tar.gz`. Zrozumienie, co robi każda flaga — i kiedy odchodzić od tego domyślnego ustawienia — odróżnia kompetentnego administratora systemu od kogoś, kto ślepo wkleja polecenia z internetu.

Zrozumienie formatu .tar.gz

Przed uruchomieniem jakiegokolwiek polecenia warto zrozumieć, z czym właściwie mamy do czynienia. Format `.tar.gz` (zapisywany również jako `.tgz`) to dwuetapowy proces:

  1. `tar` zbiera pliki, zachowuje strukturę katalogów, uprawnienia, własność i dowiązania symboliczne w jednym płaskim pliku.
  2. `gzip` kompresuje ten płaski plik przy użyciu algorytmu DEFLATE, zazwyczaj osiągając redukcję rozmiaru o 60–70% w przypadku treści tekstowych.

Ta dwuetapowa architektura wyjaśnia, dlaczego flagi `-z` (gzip) i `-x` (wyodrębnianie) są obie wymagane. Żadne z tych narzędzi samodzielnie nie obsługuje całego zadania. W nowoczesnych systemach Linux `tar` jest wystarczająco inteligentny, aby automatycznie wykryć typ kompresji za pomocą `–auto-compress` lub po prostu odczytując magiczne bajty pliku, jednak jawne podawanie flag jest zawsze bezpieczniejszą praktyką w skryptach i potokach automatyzacji.

Podstawowa składnia i opis flag

“`bash

tar -xzvf archive-name.tar.gz

“`

FlagaForma długaFunkcja
—————–———-
`-x``–extract`Wyodrębnia pliki z archiwum
`-z``–gzip`Przepuszcza archiwum przez dekompresję gzip
`-v``–verbose`Wyświetla każdą nazwę pliku podczas przetwarzania
`-f``–file=ARCHIVE`Określa nazwę pliku archiwum (musi bezpośrednio poprzedzać nazwę pliku)
`-C``–directory=DIR`Wyodrębnia do określonego katalogu docelowego
`-t``–list`Wyświetla zawartość archiwum bez wyodrębniania
`-p``–preserve-permissions`Przywraca oryginalne uprawnienia plików dokładnie
`–strip-components=N`Usuwa N wiodących komponentów ścieżki z nazw plików

Ważny szczegół: Flaga `-f` musi zawsze być ostatnią flagą przed nazwą pliku. Zapis `tar -xvzf` i `tar -xzvf` są oba poprawne, ale `tar -fxzv archive.tar.gz` zakończy się błędem, ponieważ `-f` oczekuje, że następnym argumentem będzie ścieżka do archiwum.

Przewodnik wyodrębniania krok po kroku

1. Otwórz terminal

W większości desktopowych dystrybucji Linux naciśnij `Ctrl + Alt + T`. Na serwerze bez interfejsu graficznego dostępnym przez SSH jesteś już w sesji terminalowej.

2. Zlokalizuj archiwum

“`bash

ls -lh /path/to/directory

“`

Potwierdź, że plik istnieje i zanotuj jego rozmiar. Flaga `-h` wyświetla rozmiary w formacie czytelnym dla człowieka (KB, MB, GB).

3. Wyodrębnij w miejscu

Przejdź do katalogu zawierającego archiwum, a następnie wyodrębnij:

“`bash

cd /path/to/directory

tar -xzvf archive-name.tar.gz

“`

Wyodrębnione pliki pojawią się w bieżącym katalogu roboczym, zazwyczaj wewnątrz podkatalogu odzwierciedlającego wewnętrzną strukturę archiwum.

4. Wyodrębnij do określonego katalogu

Użyj flagi `-C`, aby przekierować dane wyjściowe do dowolnej ścieżki docelowej. Jeśli katalog docelowy nie istnieje, najpierw go utwórz:

“`bash

mkdir -p /opt/myapp

tar -xzvf archive-name.tar.gz -C /opt/myapp

“`

Flaga `-p` w poleceniu `mkdir` zapobiega błędom, jeśli katalog już istnieje — dobry nawyk w skryptach.

Przykład — wdrażanie archiwum aplikacji webowej:

“`bash

mkdir -p ~/deployments/webapp-v2

tar -xzvf webapp-v2.tar.gz -C ~/deployments/webapp-v2

“`

5. Wyodrębnij bez szczegółowych danych wyjściowych

W zautomatyzowanych skryptach, zadaniach cron lub potokach CI/CD szczegółowe dane wyjściowe tworzą szum w logach. Pomiń flagę `-v`:

“`bash

tar -xzf archive-name.tar.gz -C /opt/myapp

“`

Jest to preferowana forma w automatyzacji produkcyjnej. Tryb szczegółowy jest przydatny interaktywnie, gdy trzeba potwierdzić, które pliki są zapisywane.

Wyświetlanie zawartości archiwum bez wyodrębniania

Przed wyodrębnieniem nieznanego archiwum — szczególnie pobranego z zewnętrznego źródła — zawsze najpierw sprawdź jego zawartość. Niektóre archiwa zawierają pliki z bezwzględnymi ścieżkami lub bez katalogu najwyższego poziomu, co może nieoczekiwanie rozrzucić pliki po całym systemie plików.

“`bash

tar -tzvf archive-name.tar.gz

“`

Jeśli dane wyjściowe pokazują ścieżki zaczynające się od `/` lub `..`, wyodrębniaj ostrożnie lub użyj `–strip-components` do oczyszczenia ścieżek.

Aby sprawdzić, czy istnieje katalog najwyższego poziomu:

“`bash

tar -tzf archive-name.tar.gz | head -20

“`

Jeśli wszystkie ścieżki mają wspólny prefiks (np. `myapp-1.0/`), wyodrębnianie jest czyste. Jeśli nie, utwórz dedykowany katalog i wyodrębnij do niego za pomocą `-C`.

Obsługa usuwania komponentów ścieżki

Typowy scenariusz z życia wzięty: pobierasz tarball źródłowy z GitHub, który opakowuje wszystko wewnątrz `project-main/`, ale chcesz, aby zawartość trafiła bezpośrednio do `/opt/project/` bez tej dodatkowej warstwy zagnieżdżenia.

“`bash

tar -xzvf project-main.tar.gz -C /opt/project –strip-components=1

“`

`–strip-components=1` usuwa pierwszy segment ścieżki z każdego wyodrębnianego pliku, skutecznie „rozpakowując” katalog najwyższego poziomu. Jest to powszechnie stosowane w skryptach wdrożeniowych i plikach Dockerfile.

Wyodrębnianie pojedynczego pliku lub katalogu z archiwum

Nie zawsze trzeba wyodrębniać wszystko. Aby pobrać konkretny plik:

“`bash

tar -xzvf archive-name.tar.gz path/to/specific-file.conf

“`

Aby wyodrębnić konkretny katalog i całą jego zawartość:

“`bash

tar -xzvf archive-name.tar.gz path/to/specific-directory/

“`

Ścieżka musi dokładnie odpowiadać temu, co raportuje `tar -tzf`. Ta technika jest nieoceniona przy odzyskiwaniu pojedynczego pliku konfiguracyjnego z dużego archiwum kopii zapasowej bez rozpakowywania gigabajtów danych.

Wyodrębnianie plików .tar bez kompresji gzip

Zwykły plik `.tar` nie ma warstwy kompresji. Usuń flagę `-z` całkowicie:

“`bash

tar -xvf archive-name.tar

“`

Porównanie: .tar.gz a inne popularne formaty archiwów

FormatRozszerzenieAlgorytm kompresjiStopień kompresjiSzybkośćWymagany Tar
——–———–———————–——————-——-————–
Tarball Gzip`.tar.gz` / `.tgz`DEFLATE (gzip)UmiarkowanySzybkaTak
Tarball Bzip2`.tar.bz2`Burrows-Wheeler (bzip2)WysokiWolnaTak
Tarball XZ`.tar.xz`LZMA2 (xz)Bardzo wysokiBardzo wolnaTak
Tarball Zstandard`.tar.zst`ZstandardWysokiBardzo szybkaTak
Archiwum ZIP`.zip`DEFLATEUmiarkowanySzybkaNie
Zwykły tar`.tar`BrakBrakNajszybszaTak

Kluczowa obserwacja: `.tar.xz` jest obecnie preferowanym formatem dla pakietów dystrybucji Linux (źródła jądra, tarballe źródłowe RPM/DEB) ze względu na lepszy stopień kompresji. Jednak `.tar.gz` pozostaje dominujący w ogólnej dystrybucji ze względu na powszechne wsparcie narzędziowe i szybkość wyodrębniania. `.tar.zst` (Zstandard) zyskuje popularność w nowoczesnych dystrybucjach, takich jak Arch Linux, dzięki wyjątkowej równowadze między stopniem kompresji a szybkością.

Aby wyodrębnić te alternatywne formaty, zastąp `-z` odpowiednią flagą:

“`bash

tar -xjvf archive.tar.bz2 # bzip2

tar -xJvf archive.tar.xz # xz/lzma

tar -x –zstd -vf archive.tar.zst # zstandard (GNU tar 1.31+)

“`

Zachowywanie uprawnień i własności plików

Podczas wyodrębniania archiwów zawierających pliki systemowe, skrypty lub pliki binarne aplikacji, zachowanie uprawnień ma znaczenie:

“`bash

tar -xzvpf archive-name.tar.gz

“`

Flaga `-p` instruuje tar, aby przywrócił oryginalne uprawnienia. Bez niej stosowana jest maska umask bieżącego użytkownika, co może po cichu uszkodzić wykonywalne skrypty lub pliki binarne setuid.

Aby zachować własność (wymaga uprawnień root):

“`bash

sudo tar -xzvpf archive-name.tar.gz –same-owner

“`

Jest to kluczowe przy przywracaniu kopii zapasowych systemu lub wdrażaniu pakietów aplikacji, które opierają się na określonej własności użytkownika/grupy dla granic bezpieczeństwa.

Typowe błędy i sposoby ich naprawy

`tar: Error is not recoverable: exiting now`

Archiwum jest uszkodzone lub pobieranie było niekompletne. Zweryfikuj integralność pliku za pomocą `md5sum` lub `sha256sum` względem opublikowanej sumy kontrolnej, a następnie pobierz ponownie.

`tar: Skipping to next header` / `tar: Archive contains obsolescent base-64 headers`

Częściowe uszkodzenie wewnątrz archiwum. Możesz spróbować częściowego wyodrębnienia za pomocą `–ignore-zeros`, ale traktuj dane wyjściowe jako potencjalnie niekompletne.

`gzip: stdin: not in gzip format`

Plik ma rozszerzenie `.tar.gz`, ale w rzeczywistości nie jest skompresowany gzip. Uruchom `file archive-name.tar.gz`, aby zidentyfikować rzeczywisty format. Może to być zwykły `.tar`, `.zip` lub plik `.bz2` z błędnym rozszerzeniem.

`Cannot open: No such file or directory`

Ścieżka jest nieprawidłowa lub nazwa pliku zawiera spację. Umieść nazwę pliku w cudzysłowie: `tar -xzvf "my archive.tar.gz"`.

Odmowa dostępu podczas wyodrębniania

Nie masz uprawnień do zapisu w katalogu docelowym. Użyj `sudo` lub zmień cel za pomocą `-C` na katalog, do którego masz dostęp.

Praktyczne przypadki użycia na VPS lub serwerze dedykowanym

W środowisku Hostingu VPS archiwa `.tar.gz` pojawiają się nieustannie: wdrażanie wydań aplikacji, przywracanie zrzutów baz danych, przesyłanie pakietów konfiguracyjnych między serwerami i rozpakowywanie oprogramowania skompilowanego ze źródeł.

Typowy przepływ pracy wdrożeniowej na serwerze Linux:

“`bash

Download release archive

wget https://example.com/releases/myapp-2.1.0.tar.gz

Verify integrity

sha256sum myapp-2.1.0.tar.gz

Inspect contents before extracting

tar -tzf myapp-2.1.0.tar.gz | head -30

Extract to deployment directory

sudo mkdir -p /var/www/myapp

sudo tar -xzvpf myapp-2.1.0.tar.gz -C /var/www/myapp –strip-components=1

Set correct ownership

sudo chown -R www-data:www-data /var/www/myapp

“`

Na Serwerach dedykowanych obsługujących kopie zapasowe na dużą skalę, łączenie `tar` z potokami pozwala całkowicie uniknąć zapisywania plików pośrednich na dysku:

“`bash

Create and stream a compressed archive directly over SSH to a remote server

tar -czvf – /var/www/html | ssh user@backup-server "cat > /backups/html-$(date +%F).tar.gz"

“`

Ten wzorzec jest szczególnie wydajny, gdy przestrzeń dyskowa jest ograniczona lub gdy szybkość tworzenia kopii zapasowych jest krytyczna.

Jeśli zarządzasz środowiskiem hostingu webowego przez panel sterowania, narzędzia takie jak VPS z cPanel udostępniają operacje `.tar.gz` przez interfejs Menedżera plików, ale podstawowe polecenie `tar` jest zawsze dostępne w terminalu dla zautomatyzowanych przepływów pracy.

Podczas hostowania aplikacji serwujących pliki przez HTTPS, połączenie potoku wdrożeniowego z prawidłowo skonfigurowanymi Certyfikatami SSL zapewnia, że zasoby aplikacji wyodrębniane i wdrażane są serwowane bezpiecznie od pierwszego żądania.

Dla zespołów zarządzających wieloma środowiskami, Panele sterowania VPS mogą uprościć zaplanowane operacje tworzenia i przywracania kopii zapasowych, które w dużej mierze opierają się na archiwach `.tar.gz`.

Krótki przewodnik: najczęściej używane polecenia tar

“`bash

Extract .tar.gz to current directory

tar -xzvf archive.tar.gz

Extract to specific directory

tar -xzvf archive.tar.gz -C /target/dir

Extract silently (no verbose output)

tar -xzf archive.tar.gz -C /target/dir

List contents without extracting

tar -tzvf archive.tar.gz

Extract single file

tar -xzvf archive.tar.gz path/inside/archive/file.conf

Extract and strip top-level directory

tar -xzvf archive.tar.gz -C /target/dir –strip-components=1

Extract preserving permissions and ownership (as root)

sudo tar -xzvpf archive.tar.gz –same-owner

Extract .tar.bz2

tar -xjvf archive.tar.bz2

Extract .tar.xz

tar -xJvf archive.tar.xz

“`

Macierz decyzji technicznych

ScenariuszZalecane polecenie
———-———————
Interaktywne wyodrębnianie, potrzeba śledzenia postępu`tar -xzvf archive.tar.gz`
Zautomatyzowany skrypt lub zadanie cron`tar -xzf archive.tar.gz -C /target`
Nieznana struktura archiwum, najpierw sprawdź`tar -tzf archive.tar.gzhead -20`
Wdrożenie do katalogu bez opakowania najwyższego poziomu`tar -xzf archive.tar.gz -C /target –strip-components=1`
Przywracanie kopii zapasowej systemu z dokładnymi uprawnieniami`sudo tar -xzvpf archive.tar.gz –same-owner`
Odzyskiwanie pojedynczego pliku z dużego archiwum`tar -xzf archive.tar.gz path/to/file`
Weryfikacja integralności archiwum przed wyodrębnieniem`tar -tzf archive.tar.gz > /dev/null && echo "OK"`

FAQ

Jaka jest różnica między .tar.gz a .tgz?

Są to identyczne formaty. `.tgz` to po prostu skrócony alias z pojedynczym rozszerzeniem dla `.tar.gz`, używany gdy systemy plików lub narzędzia mają ograniczenia długości rozszerzenia. Oba są wyodrębniane tym samym poleceniem `tar -xzvf`.

Dlaczego `tar -xzvf` czasami wyodrębnia pliki do bieżącego katalogu zamiast podkatalogu?

Dzieje się tak, gdy archiwum zostało utworzone bez opakowania w katalog najwyższego poziomu. Zawsze uruchamiaj `tar -tzf archive.tar.gz | head -20` przed wyodrębnianiem. Jeśli ścieżki nie mają wspólnego prefiksu, utwórz dedykowany katalog i użyj `-C` do wyodrębnienia do niego, zapobiegając rozrzuceniu plików.

Czy mogę wyodrębnić plik .tar.gz bez polecenia tar?

Tak. Możesz najpierw zdekompresować warstwę gzip za pomocą `gunzip archive.tar.gz`, co daje `archive.tar`, a następnie wyodrębnić za pomocą `tar -xvf archive.tar`. Niektóre systemy obsługują również `zcat archive.tar.gz | tar -xvf -` do bezpośredniego przesyłania dekompresji do tar. Jednak `tar -xzvf` w jednym poleceniu jest zawsze najbardziej wydajnym podejściem.

Czy flaga `-v` spowalnia wyodrębnianie dużych archiwów?

Nieznacznie, tak. W przypadku archiwów zawierających setki tysięcy małych plików, narzut związany z wyświetlaniem każdej nazwy pliku na stdout może dodać mierzalny czas. W kontekstach wymagających wydajności lub zautomatyzowanych, zawsze pomijaj `-v`.

Jak wyodrębnić plik .tar.gz jako inny użytkownik bez przełączania kont?

Użyj `sudo -u targetuser tar -xzvf archive.tar.gz -C /target/dir`. Uruchamia to proces wyodrębniania pod tożsamością docelowego użytkownika, zapewniając prawidłową własność wyodrębnionych plików bez konieczności pełnego przełączania użytkownika za pomocą `su`.

15%

Zaoszczędź 15% na wszystkich usługach hostingowych

Sprawdź swoje umiejętności i zdobądź Rabat na dowolny plan hostingowy

Użyj kodu:

Skills
Rozpocznij