Як розпакувати файли .tar.gz за допомогою командного рядка Linux
Файл .tar.gz — це стиснутий архів, створений шляхом поєднання двох окремих операцій: tar (Tape Archive), який об’єднує кілька файлів і каталогів в один архів, та gzip, який стискає цей архів для зменшення його розміру. Результатом є портативний, компактний формат пакування, що є де-факто стандартом для розповсюдження програмного забезпечення, наборів конфігурацій і системних резервних копій практично в кожному середовищі Linux та Unix-подібних систем.
Канонічна команда для розпакування архіву .tar.gz — `tar -xzvf archive-name.tar.gz`. Розуміння того, що робить кожен прапор — і коли відхилятися від цього стандарту — відрізняє компетентного системного адміністратора від того, хто сліпо копіює команди з інтернету.
Розуміння формату .tar.gz
Перш ніж виконувати будь-яку команду, корисно зрозуміти, з чим саме ви маєте справу. Формат `.tar.gz` (також записується як `.tgz`) — це двоетапний процес:
- `tar` збирає файли, зберігає структуру каталогів, права доступу, власника та символічні посилання в один плаский файл.
- `gzip` стискає цей плаский файл за допомогою алгоритму DEFLATE, зазвичай досягаючи зменшення розміру на 60–70% для текстового вмісту.
Ця двоетапна архітектура пояснює, чому прапори `-z` (gzip) та `-x` (розпакування) обидва є обов’язковими. Жоден інструмент окремо не виконує повне завдання. У сучасних системах Linux `tar` достатньо розумний, щоб автоматично визначати тип стиснення через `–auto-compress` або просто зчитуючи магічні байти файлу, але явне зазначення прапорів завжди є безпечнішою практикою у скриптах і конвеєрах автоматизації.
Основний синтаксис і довідник прапорів
“`bash
tar -xzvf archive-name.tar.gz
“`
| Прапор | Повна форма | Функція |
|---|
| —— | ———– | ———- |
|---|
| `-x` | `–extract` | Розпакувати файли з архіву |
|---|
| `-z` | `–gzip` | Пропустити архів через декомпресію gzip |
|---|
| `-v` | `–verbose` | Виводити кожне ім’я файлу під час обробки |
|---|
| `-f` | `–file=ARCHIVE` | Вказати ім’я файлу архіву (має безпосередньо передувати імені файлу) |
|---|
| `-C` | `–directory=DIR` | Розпакувати у вказаний цільовий каталог |
|---|
| `-t` | `–list` | Переглянути вміст архіву без розпакування |
|---|
| `-p` | `–preserve-permissions` | Відновити оригінальні права доступу до файлів точно |
|---|
| `–strip-components=N` | — | Видалити N початкових компонентів шляху з імен файлів |
|---|
Важлива деталь: Прапор `-f` завжди має бути останнім прапором перед іменем файлу. Написання `tar -xvzf` та `tar -xzvf` є обидва допустимими, але `tar -fxzv archive.tar.gz` не спрацює, оскільки `-f` очікує, що наступним аргументом буде шлях до архіву.
Покроковий посібник з розпакування
1. Відкрийте термінал
У більшості настільних дистрибутивів Linux натисніть `Ctrl + Alt + T`. На безголовому сервері, до якого ви підключилися через SSH, ви вже перебуваєте у сеансі терміналу.
2. Знайдіть свій архів
“`bash
ls -lh /path/to/directory
“`
Переконайтеся, що файл існує, і зверніть увагу на його розмір. Прапор `-h` відображає розміри у зручному для читання форматі (KB, MB, GB).
3. Розпакування на місці
Перейдіть до каталогу, що містить архів, а потім розпакуйте його:
“`bash
cd /path/to/directory
tar -xzvf archive-name.tar.gz
“`
Розпаковані файли з’являться у поточному робочому каталозі, зазвичай всередині підкаталогу, що відображає внутрішню структуру архіву.
4. Розпакування у вказаний каталог
Використовуйте прапор `-C` для перенаправлення виводу до будь-якого цільового шляху. Якщо каталог призначення не існує, спочатку створіть його:
“`bash
mkdir -p /opt/myapp
tar -xzvf archive-name.tar.gz -C /opt/myapp
“`
Прапор `-p` для `mkdir` запобігає помилкам, якщо каталог вже існує — корисна звичка у скриптах.
Приклад — розгортання архіву вебзастосунку:
“`bash
mkdir -p ~/deployments/webapp-v2
tar -xzvf webapp-v2.tar.gz -C ~/deployments/webapp-v2
“`
5. Розпакування без детального виводу
В автоматизованих скриптах, завданнях cron або конвеєрах CI/CD детальний вивід створює шум у журналах. Видаліть прапор `-v`:
“`bash
tar -xzf archive-name.tar.gz -C /opt/myapp
“`
Це бажана форма у виробничій автоматизації. Детальний режим корисний в інтерактивному режимі, коли потрібно підтвердити, які файли записуються.
Перегляд вмісту архіву без розпакування
Перш ніж розпаковувати незнайомий архів — особливо завантажений із зовнішнього джерела — завжди спочатку перевіряйте його вміст. Деякі архіви містять файли з абсолютними шляхами або без каталогу верхнього рівня, що може несподівано розкидати файли по всій файловій системі.
“`bash
tar -tzvf archive-name.tar.gz
“`
Якщо вивід показує шляхи, що починаються з `/` або `..`, розпаковуйте з обережністю або використовуйте `–strip-components` для очищення шляхів.
Щоб перевірити наявність обгортки каталогу верхнього рівня:
“`bash
tar -tzf archive-name.tar.gz | head -20
“`
Якщо всі шляхи мають спільний префікс (наприклад, `myapp-1.0/`), розпакування є чистим. Якщо ні — створіть окремий каталог і розпакуйте в нього за допомогою `-C`.
Робота з видаленням компонентів шляху
Поширений реальний сценарій: ви завантажуєте вихідний тарбол з GitHub, який загортає все всередині `project-main/`, але ви хочете, щоб вміст знаходився безпосередньо в `/opt/project/` без цього додаткового рівня вкладеності.
“`bash
tar -xzvf project-main.tar.gz -C /opt/project –strip-components=1
“`
`–strip-components=1` видаляє перший сегмент шляху з кожного розпакованого файлу, фактично «розгортаючи» каталог верхнього рівня. Це широко використовується у скриптах розгортання та Dockerfile.
Розпакування окремого файлу або каталогу з архіву
Не завжди потрібно розпаковувати все. Щоб витягти конкретний файл:
“`bash
tar -xzvf archive-name.tar.gz path/to/specific-file.conf
“`
Щоб розпакувати конкретний каталог з усім його вмістом:
“`bash
tar -xzvf archive-name.tar.gz path/to/specific-directory/
“`
Шлях має точно збігатися з тим, що повідомляє `tar -tzf`. Ця техніка є безцінною при відновленні одного файлу конфігурації з великого архіву резервної копії без розпакування гігабайтів даних.
Розпакування файлів .tar без стиснення gzip
Звичайний файл `.tar` не має шару стиснення. Повністю видаліть прапор `-z`:
“`bash
tar -xvf archive-name.tar
“`
Порівняння: .tar.gz та інші поширені формати архівів
| Формат | Розширення | Алгоритм стиснення | Ступінь стиснення | Швидкість | Потрібен Tar |
|---|
| ——– | ———– | ———————– | ——————- | ——- | ————– |
|---|
| Gzip тарбол | `.tar.gz` / `.tgz` | DEFLATE (gzip) | Помірний | Швидка | Так |
|---|
| Bzip2 тарбол | `.tar.bz2` | Burrows-Wheeler (bzip2) | Високий | Повільна | Так |
|---|
| XZ тарбол | `.tar.xz` | LZMA2 (xz) | Дуже високий | Дуже повільна | Так |
|---|
| Zstandard тарбол | `.tar.zst` | Zstandard | Високий | Дуже швидка | Так |
|---|
| ZIP архів | `.zip` | DEFLATE | Помірний | Швидка | Ні |
|---|
| Звичайний tar | `.tar` | Немає | Немає | Найшвидша | Так |
|---|
Ключовий висновок: `.tar.xz` наразі є бажаним форматом для пакетів дистрибутивів Linux (вихідний код ядра, вихідні тарболи RPM/DEB) завдяки своєму чудовому ступеню стиснення. Однак `.tar.gz` залишається домінуючим для загального розповсюдження завдяки універсальній підтримці інструментарію та швидкості розпакування. `.tar.zst` (Zstandard) набирає популярності в сучасних дистрибутивах, таких як Arch Linux, завдяки виключному балансу між ступенем стиснення та швидкістю.
Щоб розпакувати ці альтернативні формати, замініть `-z` відповідним прапором:
“`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+)
“`
Збереження прав доступу до файлів та власника
При розпакуванні архівів, що містять системні файли, скрипти або бінарні файли застосунків, збереження прав доступу має значення:
“`bash
tar -xzvpf archive-name.tar.gz
“`
Прапор `-p` вказує tar відновлювати оригінальні права доступу. Без нього застосовується umask поточного користувача, що може непомітно порушити виконувані скрипти або бінарні файли з setuid.
Щоб зберегти власника (потрібні права root):
“`bash
sudo tar -xzvpf archive-name.tar.gz –same-owner
“`
Це критично важливо при відновленні системних резервних копій або розгортанні пакетів застосунків, які покладаються на конкретного власника користувача/групи для меж безпеки.
Поширені помилки та способи їх усунення
`tar: Error is not recoverable: exiting now`
Архів пошкоджений або завантаження було неповним. Перевірте цілісність файлу за допомогою `md5sum` або `sha256sum` відносно опублікованої контрольної суми, а потім завантажте знову.
`tar: Skipping to next header` / `tar: Archive contains obsolescent base-64 headers`
Часткове пошкодження всередині архіву. Ви можете спробувати часткове розпакування за допомогою `–ignore-zeros`, але ставтеся до виводу як до потенційно неповного.
`gzip: stdin: not in gzip format`
Файл має розширення `.tar.gz`, але насправді не є стиснутим gzip. Запустіть `file archive-name.tar.gz` для визначення реального формату. Це може бути звичайний `.tar`, `.zip` або файл `.bz2` з неправильним розширенням.
`Cannot open: No such file or directory`
Або шлях неправильний, або ім’я файлу містить пробіл. Візьміть ім’я файлу в лапки: `tar -xzvf "my archive.tar.gz"`.
Відмова у доступі під час розпакування
У вас немає прав на запис до цільового каталогу. Або використовуйте `sudo`, або змініть ціль за допомогою `-C` на каталог, яким ви володієте.
Практичні випадки використання на VPS або виділеному сервері
У середовищі VPS Хостингу архіви `.tar.gz` з’являються постійно: розгортання релізів застосунків, відновлення дампів баз даних, передача наборів конфігурацій між серверами та розпакування програмного забезпечення, скомпільованого з вихідного коду.
Типовий робочий процес розгортання на сервері 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
“`
На Виділених серверах, що обробляють великомасштабні резервні копії, поєднання `tar` з конвеєрами дозволяє уникнути запису проміжних файлів на диск повністю:
“`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"
“`
Цей підхід особливо ефективний, коли місце на диску обмежене або коли швидкість резервного копіювання є критичною.
Якщо ви керуєте середовищем вебхостингу через панель керування, такі інструменти, як VPS з cPanel, надають доступ до операцій `.tar.gz` через інтерфейс Файлового менеджера, але базова команда `tar` завжди доступна в терміналі для скриптових робочих процесів.
При хостингу застосунків, що обслуговують файли через HTTPS, поєднання конвеєра розгортання з правильно налаштованими SSL Сертифікатами гарантує, що активи застосунку, які ви розпаковуєте та розгортаєте, обслуговуються безпечно з першого запиту.
Для команд, що керують кількома середовищами, Панелі керування VPS можуть спростити заплановані операції резервного копіювання та відновлення, які значною мірою покладаються на архіви `.tar.gz`.
Короткий довідник: найбільш використовувані команди 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
“`
Матриця технічних рішень
| Сценарій | Рекомендована команда |
|---|
| ———- | ——————— |
|---|
| Інтерактивне розпакування, потрібно бачити прогрес | `tar -xzvf archive.tar.gz` |
|---|
| Автоматизований скрипт або завдання cron | `tar -xzf archive.tar.gz -C /target` |
|---|
| Невідома структура архіву, спочатку перевірте | `tar -tzf archive.tar.gz | head -20` |
|---|
| Розгортання до каталогу без обгортки верхнього рівня | `tar -xzf archive.tar.gz -C /target –strip-components=1` |
|---|
| Відновлення системної резервної копії з точними правами доступу | `sudo tar -xzvpf archive.tar.gz –same-owner` |
|---|
| Відновлення одного файлу з великого архіву | `tar -xzf archive.tar.gz path/to/file` |
|---|
| Перевірка цілісності архіву перед розпакуванням | `tar -tzf archive.tar.gz > /dev/null && echo "OK"` |
|---|
FAQ
У чому різниця між .tar.gz та .tgz?
Це ідентичні формати. `.tgz` — це просто скорочений псевдонім з одним розширенням для `.tar.gz`, який використовується, коли файлові системи або інструменти мають обмеження на довжину розширення. Обидва розпаковуються однією і тією ж командою `tar -xzvf`.
Чому `tar -xzvf` іноді розпаковує файли у поточний каталог замість підкаталогу?
Це відбувається, коли архів був створений без обгортки каталогу верхнього рівня. Завжди запускайте `tar -tzf archive.tar.gz | head -20` перед розпакуванням. Якщо шляхи не мають спільного префіксу, створіть окремий каталог і використовуйте `-C` для розпакування в нього, запобігаючи розкиданню файлів.
Чи можна розпакувати файл .tar.gz без команди tar?
Так. Ви можете спочатку декомпресувати шар gzip за допомогою `gunzip archive.tar.gz`, що дасть `archive.tar`, а потім розпакувати за допомогою `tar -xvf archive.tar`. Деякі системи також підтримують `zcat archive.tar.gz | tar -xvf -` для передачі декомпресії безпосередньо в tar. Однак `tar -xzvf` однією командою завжди є найефективнішим підходом.
Чи сповільнює прапор `-v` розпакування великих архівів?
Незначно, так. В архівах, що містять сотні тисяч дрібних файлів, накладні витрати на виведення кожного імені файлу в stdout можуть додати відчутний час. У чутливих до продуктивності або автоматизованих контекстах завжди опускайте `-v`.
Як розпакувати файл .tar.gz від імені іншого користувача без зміни облікового запису?
Використовуйте `sudo -u targetuser tar -xzvf archive.tar.gz -C /target/dir`. Це запускає процес розпакування під ідентифікатором цільового користувача, забезпечуючи правильне призначення власника розпакованих файлів без необхідності повного перемикання користувача через `su`.
