Изначально архив проектировался для хранения файлов на магнитной ленте (отсюда и имя - Tape ARchive), которая поддерживает только последовательную запись - это наложило свой отпечаток на структуру архива. За время его существования родилось несколько схожих форматов файла архива, отличающихся деталями, такими как поддержка длинных имён, хранение разреженных и специальных файлов и т.д. Наиболее популярным форматом будет, наверное,
ustar, хотя и свежий pax тоже набирает обороты.Вне зависимости от используемого формата архив будет представлять собой последовательность записей, завершающейся маркером конца архива: двумя блоками нулей по 512 байтов. Каждая запись, в свою очередь, представляет из себя заголовок сохранённого файла, за которым следует его содержимое. Описание полей заголовка можно найти в документации, с которой в редких случаях полезно проконсультироваться: файлы могут обладать множеством атрибутов, и не для всех найдётся место в заголовке.
В простейшем случае архив будет содержать несколько записей, каждая из которых описывает свой файл. Имя файла "отсчитывается" от текущей директории, и, если путь до файла включает в себя несколько вложенных директорий, их имена просто добавляются в сохранённое имя. Ключ
-t/--list как раз выводит список имён всех сохранённых в архиве файлов:# Create test file hier
$ mkdir -p a/b/c
$ echo 123 > a/b/c/d.txt
$ tar -cf archive.tar a/
# Show each stored file name
$ tar -tf archive.tar
a/
a/b/
a/b/c/
a/b/c/d.txt
Такая простая схема записи имени файла и позволяет выполнить трюк из предыдущей заметки. А ещё к архиву можно прикрепить данные, не предназначенные для посторонних глаз:
tar игнорирует всё после маркера конца файла:# Add a secret string after 2 terminating zero blocks
$ echo 'Hello Elliot' >> archive.tar
# Nothing suspicious...
$ tar -tf archive.tar
a/
a/b/
a/b/c/
a/b/c/d.txt
# ...but secret string is still here!
$ tail -n1 archive.tar
Hello Elliot
Конечно, особо внимательный исследователь найдёт расхождение в размере файла, однако когда-нибудь эта лазейка может и пригодиться.
Над другими базовыми операциями над архивом задерживаться не интересно, а вот "продвинутые" операции (create/update/delete) уже заслуживают внимания, попутно демонстрируя наследие магнитных лент: все изменения вносятся в конец архива, команды практически никогда не переписывают уже имеющееся содержимое - о них в следующей части заметки.


