Linux. Команда tar
19.06.2023
Теги: CLI • Linux • Директория • Команда • Файл
По умолчанию в ОС Linux включен встроенный архиватор tar
, позволяющий запаковывать/распаковывать архив и выполнять много других операций с архивами. В его функционал не входит компрессия, но он отлично работает с утилитами сжатия gzip
, bzip2
и xz
.
Синтаксис команды
$ tar опции архив файл(ы)
Существует три основных действия, которые можно сделать с архивом — создать (опция -c
), распаковать (опция -x
) и просмотреть список файлов (опция -t
). Архиватор не сжимает файлы, но позволяет использовать gzip
(опция -z
), bzip2
(опция -j
) и xz
(опция -J
).
Опция -f
задает имя файла архива, опция -v
устанавливает verbose режим. Опция -u
позволяет обновить файлы в архиве (по времени модификации). Опция -p
восстанавливает права файлов при извлечении из архива.
Создание архива
Создать новый архив без сжатия и добавить в него один файл
$ tar cvf archive.tar readme.txt readme.txt
Создать новый архив без сжатия и добавить в него директорию
$ rm archive.tar $ tar cvf archive.tar data/ data/ data/data.txt data/xml/ data/xml/one.xml data/xml/two.xml data/csv/ data/csv/one.csv data/csv/two.csv
Содержимое архива
Посмотреть содержимое архива, который создали только что
$ tar tf archive.tar data/ data/data.txt data/xml/ data/xml/one.xml data/xml/two.xml data/csv/ data/csv/one.csv data/csv/two.csv
Распаковка архива
Извлечь содержимое архива, который создали только что
$ mv data/ data-source/ $ tar xvf archive.tar data/ data/data.txt data/xml/ data/xml/one.xml data/xml/two.xml data/csv/ data/csv/one.csv data/csv/two.csv
Обратите внимание, что tar
сохраняет пути к файлам в архиве и распаковывает с учетом этих путей в текущую директорию. Поэтому мы изменили имя исходной директории data
на data-source
. При извлечении файлов их архива — tar
создал директорию data
в текущей директории и вложенные директории data/xml
и data/csv
.
Распаковка в директорию
С помощью опции -C
можно указать директорию, куда нужно распаковать архив — но директорию нужно создать заранее
$ mkdir extract $ tar -C extract/ -xvf archive.tar data/ data/data.txt data/xml/ data/xml/one.xml data/xml/two.xml data/csv/ data/csv/one.csv data/csv/two.csv
Распаковка без вложенности
Внутри директории extract
теперь есть директория data
. Иногда это может быть неудобно и хотелось бы распаковать без вложенной директории — за это отвечает опция --strip-components
.
$ rm -rf extract/* $ tar -C extract/ -xvf archive.tar --strip-components=1 data/data.txt data/xml/ data/xml/one.xml data/xml/two.xml data/csv/ data/csv/one.csv data/csv/two.csv
Теперь директория extract
содержит файл data.txt
и директории xml
и scv
— нет вложенной директории data
.
Частичное извлечение
Извлечь из архива archive.tar
файл data/xml/one.xml
в директорию extract
без вложенности
$ rm -rf extract/* $ tar -C extract/ -xvf archive.tar --strip-components=2 data/xml/one.xml data/xml/one.xml
Извлечь из архива archive.tar
файлы data/xml/one.xml
и data/csv/one.csv
в директорию extract
без вложенности
$ rm -rf extract/* $ tar -C extract/ -xvf archive.tar --strip-components=2 data/xml/one.xml data/csv/one.csv data/xml/one.xml data/csv/one.csv
Извлечь из архива archive.tar
директорию data/csv
в директорию extract
без вложенности
$ rm -rf extract/* $ tar -C extract/ -xvf archive.tar --strip-components=2 data/csv data/csv/one.csv data/csv/two.csv $ ls -la extract/ итого 16 drwxrwxr-x 2 evgeniy evgeniy 4096 июн 19 14:25 . drwxr-x--- 27 evgeniy evgeniy 4096 июн 19 14:21 .. -rw-rw-r-- 1 evgeniy evgeniy 33 июн 19 12:22 one.csv -rw-rw-r-- 1 evgeniy evgeniy 33 июн 19 12:24 two.csv
Извлечь из архива archive.tar
директории data/csv
и data/xml
в директорию extract
без вложенности
$ rm -rf extract/* $ tar -C extract/ -xvf archive.tar --strip-components=2 data/csv data/xml data/xml/one.xml data/xml/two.xml data/csv/one.csv data/csv/two.csv $ ls -la extract/ итого 24 drwxrwxr-x 2 evgeniy evgeniy 4096 июн 19 16:27 . drwxr-x--- 27 evgeniy evgeniy 4096 июн 19 16:24 .. -rw-rw-r-- 1 evgeniy evgeniy 33 июн 19 12:22 one.csv -rw-rw-r-- 1 evgeniy evgeniy 33 июн 19 12:25 one.xml -rw-rw-r-- 1 evgeniy evgeniy 33 июн 19 12:24 two.csv -rw-rw-r-- 1 evgeniy evgeniy 33 июн 19 12:25 two.xml
Исключение по маске
При создании архива, с помощью опции --exclude
, часть файлов или директорий можно пропустить.
$ rm archive.tar $ tar --exclude='*.xml' -cvf archive.tar data/ # пропускаем все xml-файлы data/ data/data.txt data/xml/ data/csv/ data/csv/one.csv data/csv/two.csv
$ rm archive.tar $ tar --exclude='data/csv' -cvf archive.tar data/ # пропускаем директорию data/csv data/ data/data.txt data/xml/ data/xml/one.xml data/xml/two.xml
Добавление в архив
После создания архива можно добавлять в него файлы и директории с помощью опции -r
или --append
$ rm archive.tar $ tar cvf archive.tar data/data.txt # создаем архив data/data.txt
$ tar rvf archive.tar data/csv # добавляем директорию data/csv/ data/csv/one.csv data/csv/two.csv
$ tar rvf archive.tar data/xml # добавляем директорию data/xml/ data/xml/one.xml data/xml/two.xml
$ tar -tf archive.tar # список файлов в архиве data/data.txt data/csv/ data/csv/one.csv data/csv/two.csv data/xml/ data/xml/one.xml data/xml/two.xml
Удаление из архива
Файлы и директории можно не только добавлять в архив, но и удалять из архива
$ tar tf archive.tar # список файлов в архиве data/data.txt data/csv/ data/csv/one.csv data/csv/two.csv data/xml/ data/xml/one.xml data/xml/two.xml
$ tar f archive.tar --delete data/xml/one.xml # удаляем файл $ tar tf archive.tar # список файлов в архиве data/data.txt data/csv/ data/csv/one.csv data/csv/two.csv data/xml/ data/xml/two.xml
$ tar f archive.tar --delete data/csv # удаляем директорию $ tar tf archive.tar # список файлов в архиве data/data.txt data/xml/ data/xml/two.xml
Сжатие архива
Тут все просто — добавляется всего одна опция как при добавлении в архив, так и при извлечении из архива
$ tar cvzf archive.tar.gz data/ # создание сжатого архива, gzip data/ data/data.txt data/xml/ data/xml/one.xml data/xml/two.xml data/csv/ data/csv/one.csv data/csv/two.csv
$ rm -rf extract/* $ tar -C extract/ -xvzf archive.tar.gz # распаковка сжатого архива, gunzip data/ data/data.txt data/xml/ data/xml/one.xml data/xml/two.xml data/csv/ data/csv/one.csv data/csv/two.csv
$ tar cvjf archive.tar.bz data/ # создание сжатого архива, bzip2 data/ data/data.txt data/xml/ data/xml/one.xml data/xml/two.xml data/csv/ data/csv/one.csv data/csv/two.csv
$ tar -C extract/ -xvjf archive.tar.bz # распаковка сжатого архива, bunzip2 data/ data/data.txt data/xml/ data/xml/one.xml data/xml/two.xml data/csv/ data/csv/one.csv data/csv/two.csv