1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
|
1️⃣ **Распаковка tar**
Для распаковки архива в формате **.tar** в текущую директорию выполните команду:
`tar xvf archive.tar
2️⃣ **Распаковка tar.bz2, tar.bzip2, tbz2, tb2, tbz**
`tar xvjf archive.tar.bz2
3️⃣ **Распаковка tar.xz, txz**
`tar xvJf archive.tar.xz
4️⃣ **Распаковка tar.gz, tgz**
`tar xvzf archive.tar.gz
5️⃣ **Распаковка tar.lzma**
`tar --lzma -xvf archive.tar.lzma
🤔 **Пояснение опций**
x — распаковать архив.
v — Verbose-режим (вывод на экран дополнительной информации во время распаковки).
f — выполнить распаковку архива из файла.
j — вызвать bzip2 для распаковки архива.
z — вызвать gzip
J — вызвать xz
Чтобы распаковать архив в определенную директорию используется опция -C или --directory, например:
`tar xvf archive.tar -C /to/directory
=====================================
 Обновлено: 24.07.2024  Опубликовано: 18.11.2016
### Создать
Создание выполняется с ключом **c**. Синтаксис следующий:
tar -c<опции> <новый архивный файл> <что сжимаем>
Пример создания:
tar -czvf archive.tar.gz /home/dmosk
_* в данном примере будет создан архив **archive.tar.gz** домашней директории пользователя (**/home/dmosk**)
** где **z** — сжать архив в gzip (без этого параметра, tar не сжимает, а создает так называемый тарбол); **c** — ключ на создание архива; **v** — verbose режим, то есть с выводом на экран процесса (очень удобно для наблюдением за ходом работы, но в скриптах можно упустить); **f** — использовать файл (обязательно указываем, так как в большей степени работаем именно с файлами)._
### Распаковать
Распаковка выполняется с ключом **x** с синтаксисом:
tar -x<опции> <архивный файл>
Пример распаковки:
tar -xvf archive.tar.gz
## Форматы
Утилита tar позволяет работать с архивами различных форматов. Рассмотрим их кратко.
### gz
Сжатие:
tar -cf archive.tar.gz /files
Распаковка .gz файла:
tar -xf archive.tar.gz
_* при возникновении ошибки **This does not look like a tar archive**, можно воспользоваться командой **gzip -d archive.tar.gz**._
### bz2
tar -xvjf archive.tar.bz2
_* ключ j отвечает за работу с bz2._
Если система ругается на bzip2, значит нужно его установить:
apt-get install bzip2
Если видим ошибку **tar: Unrecognized archive format**, воспользуемся следующей командой:
bzip2 -d archive.tar.bz2
### gzip
tar -xvzf archive.tar.gzip
_* ключ z отвечает за работу с gzip._
### tgz
TGZ — tar-архив, сжатый с помощью утилиты gzip. По сути, это тот же tar.gz, и работа с ним ведется такими же командами. Рассмотрим примеры работы с данным форматом.
Для создания архива tgz выполняем:
tar -czf archive.tgz /files
Распаковывается, как gzip:
tar -xzf archive.tgz
### xz
Это формат сжатия данных с помощью алгоритма LZMA. Для работы с ним устанавливаем:
apt install xz-utils
_* на Debian / Ubuntu._
yum install xz
_* на Rocky Linux / CentOS._
Теперь можно пользоваться.
Создать архив:
tar -cpJf archive.tar.xz /home/user
Распаковка:
tar -xpJf archive.tar.xz
## Описание ключей tar
### Команды для действия
|Ключ|Описание|
|---|---|
|-A|Добавление файлов в архив.|
|-c|Создание нового архивного файла.|
|-d|Показать отличающиеся данные между каталогом-исходником и содержимым архива.|
|--delete|Удалить файлы внутри архива.|
|-r|Добавить файлы в конец архива.|
|-t|Показать содержимое архива.|
|-u|Добавить файлы, которых нет в архиве.|
|-x|Извлечь файлы из архива.|
_* нельзя использовать несколько вышеперечисленных ключей в одной команде._
### Дополнительные опции
|Ключ|Описание|
|---|---|
|--atime-preserve|Оставить прежнюю метку времени доступа для файла.|
|-b N|Задать размер блока N x 512.|
|-C|Смена каталога. По умолчанию, используется тот, в котором мы находимся.|
|--checkpoint|Показать имена папок при чтении архивного файла.|
|-G|Использование старого формата инкрементального резервирования при отображении или извлечения.|
|-g|Использование нового формата инкрементального резервирования при отображении или извлечения.|
|-h|Не дублировать символьные ссылки. Только файлы, на которые указывают эти симлинки.|
|-i|Игнорировать блоки нулей.|
|-j|Использование bzip2.|
|--ignore-failed-read|Игнорировать не читаемые файлы.|
|-k|При распаковке, существующие файлы не заменяются соответствующими файлами из архива.|
|-L N|Смена магнитной ленты после N*1024 байт.|
|-m|При извлечении игнорировать время модификации объекта.|
|-M|Многотомные архивы.|
|-N DATE|Сохранять только более новые файлы относительно DATE|
|-O|Направление извлекаемого на стандартный вывод.|
|-p|Извлечение защищенной информации.|
|-P|Не отбрасывает начальный слэш (/) из имен.|
|-s|Сортировка файлов при извлечении.|
|--preserve|Аналогично -ps|
|--remove-files|Удалить исходные файлы после добавления в архив.|
|--same-owner|Сохранить владельца при извлечении.|
|--totals|Вывод байт при создании архива.|
|-v|Протоколирование действий — отображение списка объектов, над которыми происходит действие.|
|-V NAME|Создание архива на томе с меткой NAME.|
|--version|Показать версию tar.|
|-w|Требовать подтверждения для каждого действия.|
|-W|Проверка архива после записи.|
|--exclude FILE|Исключить файл FILE.|
|-X FILE|Исключить файлы FILE.|
|-Z|Фильтрует архив с помощью compress.|
|-z|Использование gzip.|
* актуальный список опций можно получить командой **man tar**.
## Примеры
Рассмотрим некоторые сценарии использования tar.
### Распаковать в определенную папку
tar -C /home/user -xvf archive.tar.gz
_* ключ **-C** используется для указания папки, куда необходимо распаковать файлы из архива._
### Распаковка без вложенной папки
Такой способ можно использовать для распаковки в заранее подготовленный каталог. Будет некий эффект переименовывания каталога или аналог «Распаковать здесь»:
tar -C /home/admin/mytar -xvf admin.tar.gz --strip-components 1
_* каталог **/home/admin/mytar** заранее должен быть создан; **--strip-components 1** пропустит одну вложенную папку внутри архива._
### Указать конкретный файл или каталог для распаковки
Если у нас большой архив, но извлечь нужно конкретный файл или каталог, то можно указать его через пробел после указания файла с архивом. Синтаксис:
tar zxf <путь до архива> <что извлечь>
Рассмотрим пример. Напомним, что можно посмотреть содержимое архива с помощью опции t:
tar tf /backup/samba.tar.gz
Теперь можно распаковать архив:
tar -zxf /backup/samba.tar.gz mail
_* предположим, что внутри архива **samba.tar.gz** есть что-то и каталог **mail**. Извлечем мы только последний._
### Исключение файлов по маске
Если необходимо пропустить некоторые файлы, вводим команду с ключом --exclude:
tar --exclude='sess_*' -czvf archive.tar.gz /wwwsite
_* в данном примере мы создадим архив **archive.tar.gz**, в котором не будет файлов, начинающихся на **sess_**._
Также можно исключить несколько файлов или папок, добавляя несколько опций exclude:
tar --exclude='/data/recycle' --exclude='*.tmp' -zcf /backup/samba/2021-08-29.tar.gz /data/
_* в данном примере мы исключим папку **recycle** и файлы, которые заканчиваются на **.tmp**_
### Работа с архивами, разбитыми на части
Разбить архив на части может понадобиться по разным причинам — нехватка места на носителе, необходимость отправки файлов по почте и так далее.
Чтобы создать архив, разбитый на части, вводим команду:
tar -zcvf - /root | split -b 100M - root_home.tar.gz
_* данная команда создаст архив каталога **/root** и разобьет его на части по **100 Мб**._
> Если у нас уже есть архив, который нужно разбить, команда будет такой:
>
> split -b 100M root_home.tar.gz root_home.tar.gz
>
> _* в данном примере архив **root_home.tar.gz** будет разбит на части, состояние из файлов по 100 Мб._
В итоге мы получим, примерно, такую картину:
root_home.tar.gzaa root_home.tar.gzac root_home.tar.gzae
root_home.tar.gzag root_home.tar.gzai root_home.tar.gzab
root_home.tar.gzad root_home.tar.gzaf root_home.tar.gzah
Чтобы собрать архив и разархивировать его, вводим команду:
cat root_home.tar.gz* | tar -zxv
> Если мы хотим только собрать разбитый архив, вводим:
>
> cat root_home.tar.gz* > root_home.tar.gz
### Создание tar из отдельных файлов с последующим его архивированием
Мы можем собрать файл tar, добавляя по очереди в него файлы, после чего создать сжатый архив. Предположим, у нас 3 файла: file1, file2, file3.
Сначала создадим tar-файл с первым файлом внутри:
tar -cf ./my_archive.tar ./file1
Следующими двумя командами мы добавим в архив файлы file2 и file3:
tar -rf ./my_archive.tar ./file2
tar -rf ./my_archive.tar ./file3
Сожмем содержимое tar-файла:
gzip < ./my_archive.tar > ./my_archive.tar.gz
Файл tar можно удалить:
rm -f my_archive.tar
### Рекурсивная распаковка
Предположим, что у нас есть архив, в котором есть еще архив. И еще и еще много раз. Чтобы не заниматься ручной распаковкой, можно использовать команду с while:
while [ -f *.tar.gz ]; do filename="$(ls -1 *.tar.gz | head -n 1)"; tar -xvf $filename && rm $filename; done;
Обратите внимание, что данная команда удалит исходный файл архива, а также будет искать архив по маске, поэтому в каталог, где выполняем команду не стоит копировать другие архивы.
## ZIP
Tar не работает с zip-архивами. В системах UNIX для этого используем утилиты zip и unzip. Для начала, ставим нужные пакеты:
yum install zip unzip
apt-get install zip unzip
pkg install zip unzip
_* соответственно, для RPM based, deb based, BSD based._
Создание ZIP:
zip -r archive.zip /home/dmosk
_* создает архив каталога **/home/dmosk** в файл **archive.zip**._
Распаковка ZIP:
unzip archive.zip
|