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