архиватор_tar

tar archive

В мире программного обеспечения для Unix-подобных систем существует программа tar – классический инструмент для архивирования файлов. Ее имя, которое расшифровывается как tape archive (архив на магнитной ленте), указывает, что первоначально инструмент предназначался для создания архивов на магнитных лентах.

Команда tar имеет следующий синтаксис:

tar режим[параметры] путь...

где под режимом подразумевается один из нескольких режимов работы, перечисленные ниже:

Режим Описание
c Создать архив из списка файлов и/или каталогов
x Извлечь файлы из архива
r Добавить указанный файл и/или каталог в конец архива
t Вывести список содержимого архива

Рассмотрим несколько примеров работы команды tar. Для начала создадим песочницу:

mkdir -p playground/dir-{001..100}
touch playground/dir-{001..100}/file-{A..Z}

Далее создадим архив всей песочницы:

tar cf playground.tar playground/

Эта команда создаст tar-архив с именем playground.tar, включающий всю иерархию каталогов песочницы. Как видите, режим и параметр f, который используется для определения имени tar-архива, можно объединять, и при этом не требуется использовать начальный дефис. Но имейте в виду, что режим всегда должен указываться первым, перед любыми параметрами. Посмотреть содержимое архива можно с помощью следующей команды:

tar tf playground.tar

Для получения более подробного списка добавим параметр v:

tar tfv playground.tar

Теперь извлечем содержимое архива в другой каталог. Для этого создадим новый каталог с именем foo, перейдем в него и извлечем содержимое tar-архива:

mkdir foo
cd foo
 
tar xf ../playground.tar
 
ls
playground

Если внимательно исследовать содержимое ~/foo/playground, можно заметить, что в результате распаковывания архива мы получили точные копии оригинальных файлов. Однако следует помнить, что если не действуете от имени суперпользователя, файлы и каталоги, извлеченные из архива, будут принадлежать пользователю, выполнившему восстановление, а не первоначальному их владельца.

Другой интересной особенностью tar является способ обработки путей в архивах. По умолчанию используются относительные пути, а не абсолютные. Для этого программа tar просто удаляет начальный слеш во всех путях. Чтобы показать это, создадим снова архив, но на этот раз укажем абсолютный путь к архивируемому каталогу. Делается это благодаря опции P:

tar cfP playground2.tar ~/playground

При распаковке архива можно ограничить количество извлекаемых данных. Например, можно извлечь из архива единственный файл:

tar xf archive.tar путь_к_файлу

Добавление в конец команды пути к файлу гарантирует извлечение только этого файла. Можно указать несколько путей. Обратите внимание, что путь к файлу должен быть полным относительным путем в архиве. Обычно в путях к файлам нельзя использовать групповые символы; но GNU-версия tar (именно эта версия входит в состав большинства дистрибутивов Linux) поддерживает параметр --wildcards. В следующем примере используется файл playground2.tar, созданный выше:

cd foo
tar xf ../playground2.tar --wildcards 'home/nevvad/playground/dir-*/file-A'

Эта команда извлечет только файлы, соответствующие указанному пути с групповым символом dir-*.

Программа tar часто используется в сочетании с find. В следующем примере команда find используется для поиска файлов, подлежащих включению в архив:

find playground/ -name 'file-A' -exec tar rf playground.tar '{}' '+'

Здесь команда find отыскивает в каталоге playground все файлы с именем file-A и затем с помощью операции -exec вызывает tar в режиме добавления в конец ®, чтобы добавить найденные файлы в архив playground.tar.

Использование tar в сочетании с find предоставляет отличный способ инкрементного резервного копирования дерева каталогов или всей системы. Применяя find для поиска файлов, более новых, чем эталонный файл, определяющий отметку времени, можно создать архив, содержащий только более новые файлы, чем файлы предыдущего архива, при этом предполагается, что время последнего изменения эталонного файла будет изменяться сразу после создания архива.

Программа tar способна также использовать стандартный ввод и стандартный вывод. Например:

find playground/ -name 'file-B' | tar cf - --files-from=- | gzip > playground.tgz

Здесь программа find создает список файлов и передает его по конвейеру программе tar. Когда программе tar передается имя файла - (дефис), под ним подразумевается стандартный ввод или стандартный вывод, в зависимости от контекста.
Кстати, соглашение об использовании дефиса (-) для представления стандартного ввода/вывода используется также многими другими программами.
Параметр --files-from (который можно заменить эквивалентным параметром -T) заставляет tar читать список путей из файла, а не из командной строки. Наконец, архив, произведенный программой tar, передается по конвейеру программе gzip, чтобы в результате получить сжатый архив playground.tgz. Расширение .tgz по общепринятому соглашению используется для tar-архивов, сжатых программой gzip. Так же, очень часто используется расширение .tar.gz.

В примере, приведенном выше, для сжатия архива использовалась внешняя программа gzip, однако современные GNU-версии tar поддерживают возможность gzip и bzip2-сжатия своими встроенными средствами, для чего служат параметры z и j соответственно. Взяв за основу предыдущий пример, его можно упростить, как показано ниже:

find playground/ -name "file-C" | tar czf playground4.tgz -T -

Если, напротив, понадобится создать архив, сжатый в формате bzip2, это можно сделать так:

find playground/ -name "file-D" | tar cjf playground5.tbz -T -

Произведя простую замену параметра сжатия z на j (и изменив расширение выходного файла на .tbz, указывающее, что для сжатия использовался алгоритм bzip2), было задействовано bzip2-сжатие.

Другой интересный пример использования поддержки стандартного ввода и вывода командой tar связан с передачей файлов между системами по сети. Представьте, что имеется две машины, действующие под управлением Unix-подобных систем и имеющие программы tar и ssh. В этом случае можно организовать передачу каталога из удаленной системы (с именем remote-host в этом примере) в локальную:

mkdir remote-stuff
cd !$
 
ssh user@remote-host 'tar cf - DirName' | tar xf -
 
ls
DirName

Здесь мы скопировали каталог Documents из удаленной системы remote-host в каталог с именем remote-stuff в локальной системе. Как это получилось? Во-первых, была запущена программа tar в удаленной системе с помощью команды ssh. Как вы наверняка знаете, ssh позволяет выполнить программу на удаленном компьютере в сети и «увидеть» результат в локальной системе — стандартный вывод, полученный в удаленной системе, пересылается в локальную систему для обзора. Мы воспользовались этой особенностью и заставили tar создать архив (режим c) и вывести его не в файл, а в стандартный вывод (параметр f с дефисом в качестве аргумента), вследствие чего архив передается через шифрованный туннель, созданный программой ssh, локальной системе. В локальной системе мы вызвали tar с целью распаковать архив (режим x), полученный со стандартного ввода (все тот же параметр f с дефисом в качестве аргумента).

Просмотр архива без разархивирования

tar -tf archive.tar.gz
# либо
tar -ztf ./scripts.backup.2017-05-31 | less

Подсчет количества файлов в архиве

 tar -ztf ./scripts.backup.2017-05-31 | wc -l

разархивация в указанную директорию

tar -xzf archive.tar.gz -C myfolder

архивация

tar cfvz archive.tar.gz /forpack
Теперь подробнее про ключи
-с — команда, которая означает «создать архив»
-f — команда на упаковку файлов и директорий в один файл архива
-v — включает визуальное отображение процесса архивации
-z — использовать для сжатия GZip

Исключаем директорию из копирования:

tar czfv /root/backup.tar.gz --exclude=/root/bak/secure/dir_name /root/bak
  • архиватор_tar.txt
  • Последнее изменение: 2022/06/29 12:04
  • admin