Команда ar в linux

Обновлено: 03.07.2024

Архиватор , также известный просто как ар , является Unix утилиты , которая поддерживает группу файлов в один архивный файл . Сегодня ar он обычно используется только для создания и обновления файлов статических библиотек, которые использует редактор ссылок или компоновщик, а также для создания пакетов .deb для семейства Debian ; его можно использовать для создания архивов для любых целей, но он в значительной степени заменен tar для целей, отличных от статических библиотек. Реализация ar включена как один из GNU Binutils .

В Linux Standard Base (LSB) ar он объявлен устаревшим и, как ожидается, исчезнет в будущем выпуске этого стандарта. Обоснованием этого было то, что «LSB не включает в себя утилиты для разработки программного обеспечения и не определяет форматы файлов .o и .a».

СОДЕРЖАНИЕ

Детали формата файла

Диаграмма, показывающая пример файловой структуры файла .deb

Формат ar никогда не стандартизировался; современные архивы основаны на общем формате с двумя основными вариантами, BSD и System V (первоначально известными как COFF и также используемыми GNU , ELF и Windows ).

Исторически существовали и другие варианты, включая V6 , V7 , AIX (маленький и большой) и Coherent, которые все значительно отличаются от общепринятого формата.

Архивы Debian ". Deb " используют общий формат.

Файл ar начинается с глобального заголовка , за которым следует заголовок и раздел данных для каждого файла, хранящегося в файле ar.

Каждый раздел данных выровнен по 2 байта. Если он заканчивается нечетным смещением, в качестве заполнителя используется новая строка ('\ n', 0x0A).

Подпись файла

Подпись файла - это одно поле, содержащее магическую строку ASCII, "!<arch>" за которой следует один управляющий символ LF (0x0A).

Заголовок файла

Каждый файл, хранящийся в архиве ar, включает заголовок файла для хранения информации о файле. Общий формат следующий. Числовые значения кодируются в ASCII, и все значения дополняются справа пробелами ASCII (0x20).

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

Члены выровнены по четным границам байтов. «Каждый элемент архивного файла начинается на четной границе байта; при необходимости между файлами вставляется новая строка. Тем не менее, указанный размер отражает фактический размер файла без дополнения».

Из-за ограничений длины и формата имени файла, варианты GNU и BSD разработали разные методы хранения длинных имен файлов. Хотя общий формат не страдает от проблемы 2038 года , многие реализации утилиты ar нуждаются и, возможно, в будущем потребуется изменить для правильной обработки временных меток, превышающих 2147483647. Описание этих расширений можно найти в libbfd.

В зависимости от формата, многие реализации ar включают в себя глобальную таблицу символов (также известную как armap, каталог или индекс) для быстрого связывания без необходимости сканировать весь архив в поисках символа. POSIX распознает эту функцию и требует, чтобы реализации ar имели -s возможность ее обновления. Большинство реализаций помещают его в первую запись файла.

Вариант BSD

Утилита BSD ar традиционно не обрабатывает построение глобальной таблицы поиска символов и делегирует эту задачу отдельной утилите с именем ranlib , которая вставляет зависящий от архитектуры файл с именем __.SYMDEF первого члена архива. Некоторые потомки ставят после имени пробел и «СОРТИРОВАНО», чтобы указать отсортированную версию. 64-битный вариант, называемый Дарвином, __.SYMDEF_64 существует .

Однако, поскольку POSIX добавил требование для этой -s опции в качестве замены ranlib, более новые реализации BSD ar были переписаны, чтобы иметь эту функцию. FreeBSD, в частности, отказалась от формата таблицы SYMDEF и приняла таблицу стиля System V.

Вариант System V (или GNU)

System V ar использует символ '/' (0x2F) для обозначения конца имени файла; это позволяет использовать пробелы без использования расширенного имени файла. Затем он сохраняет несколько расширенных имен файлов в разделе данных файла с именем «//», на эту запись будут ссылаться будущие заголовки. Заголовок ссылается на расширенное имя файла, сохраняя "/" с последующим десятичным смещением до начала имени файла в разделе данных расширенного имени файла. Формат этого файла «//» представляет собой просто список длинных имен файлов, каждое из которых разделено одним или несколькими символами LF. Обратите внимание, что десятичные смещения - это количество символов, а не номер строки или строки в файле "//". Обычно это вторая запись файла после таблицы символов, которая всегда является первой.

System V ar использует специальное имя файла «/», чтобы обозначить, что следующая запись данных содержит таблицу поиска символов, которая используется в библиотеках ar для ускорения доступа. Эта таблица символов состоит из трех частей, которые записываются вместе как непрерывные данные.

  1. 32-битное целое число с прямым порядком байтов, указывающее количество записей в таблице.
  2. Набор 32-битных целых чисел с прямым порядком байтов. По одному для каждого символа, регистрируя позицию в архиве заголовка файла, содержащего этот символ.
  3. Набор строк с нулевым завершением. Каждый из них представляет собой имя символа и встречается в том же порядке, что и список позиций в части 2.

Некоторые системы System V не используют описанный выше формат для таблицы поиска символов. Для операционных систем, таких как HP-UX 11.0, эта информация хранится в структуре данных на основе формата файла SOM .

Специальный файл «/» не заканчивается определенной последовательностью; конец предполагается после того, как будет прочитано последнее имя символа.

Чтобы преодолеть ограничение на размер файла в 4 ГиБ, некоторые операционные системы, такие как Solaris 11.2 и GNU, используют таблицу поиска вариантов. Вместо 32-битных целых чисел в таблицах поиска символов используются 64-битные целые числа. Строка «/ SYM64 /» вместо «/» используется в качестве идентификатора для этой таблицы.

Вариант Windows

Вариант Windows (PE / COFF) основан на варианте SysV / GNU. Первая запись «/» имеет ту же структуру, что и таблица символов SysV / GNU. Вторая запись - это еще один символ «/», расширение Microsoft ECOFF, в котором хранится расширенная таблица перекрестных ссылок символов. Этот отсортирован и использует целые числа с прямым порядком байтов. Третья запись - это необязательные данные с длинным именем «//», как в SysV / GNU.

Тонкий архив

Версия ar в GNU binutils и Elfutils имеет дополнительный формат «тонкого архива» с магическим числом ! <thin> . Тонкий архив содержит только таблицу символов и ссылки на файл. Формат файла - это, по сути, архив формата System V, где каждый файл хранится без разделов данных. Каждое имя файла хранится как «длинное» имя файла, и они должны разрешаться, как если бы они были символическими ссылками .

Пример использования

Чтобы создать архив из файлов class1.o , class2.o , class3.o , будет использоваться следующая команда:

Компоновщики Unix, обычно вызываемые через компилятор C cc , могут читать ar файлы и извлекать из них объектные файлы , поэтому если libclass.a это архив, содержащий class1.o , class2.o и class3.o , то

или (если libclass.a помещен в стандартный путь к библиотеке, например / usr / local / lib )

Синтаксис:

Параметры:

    r: Используется для создания архива, вставки файлов в архив. Это отличается от q тем, что удаляет все ранее существующие элементы. Если какое-либо имя файла не существует, выдается ошибка. По умолчанию он добавляет новый элемент в конец файла.

Пример: Предположим, что есть файл с именем star1, и вы хотите создать архив с именем «super» без модификатора, тогда вы можете использовать следующую команду:


Это создаст архив с участником star1 . С модификатором это выглядит так:


Примечание . Модификатор v дает строку или вывод с буквой a или r, указывающей, добавлен файл или нет.

В нашем предыдущем случае мы использовали star1.txt в архиве super.a , теперь мы удалим этот файл оттуда


В том , что мы должны были super.a архивирование хранения star1.txt, после использования D без модификатора он просто удалил файл
Теперь давайте посмотрим на тот же пример с модификатором v


С помощью модификатора v он перечисляет модули по мере их удаления.


Здесь он дал вывод, который был записан в наших файлах stat1.txt и star2.txt , теперь давайте проверим, что происходит, когда мы используем в нем модификатор v .


С помощью модификатора сначала получите имя файла, а затем содержимое, записанное внутри него.


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


На этот раз с использованием модификатора мы получаем соответствующее смещение каждого члена.


Модификатор v отображает каждый извлеченный файл, а также мы не указали имя, поэтому он извлекает весь архив, если мы указываем имена членов, он извлекает только этот элемент.

Эта команда не извлекает тонкие файлы, как в нашем случае, она просто показывает, что она распаковала архив.


В наши дни мы сталкиваемся с файлами архивов очень часто и на всех платформах: Windows, Mac или Linux. Это могут быть программы, резервные копии систем или баз данных или просто архив файлов. Нам также часто приходится создавать свои архивы в Linux, чтобы передать несколько файлов друзьям или загрузить на файлообменник. В виде архивов распространяются пакеты программ, исходные коды, а также много других файлов, распространяемых на просторах интернета. Научиться выполнять архивирование файлов в Linux через терминал очень важно, возможно это вам понадобиться, когда не будет доступа к графическому интерфейсу, или просто со временем в терминале станет более приятно работать.

В этой инструкции я хочу подробно рассмотреть утилиты для архивирования в Linux, мы рассмотрим не только самую популярную и универсальную утилиту - tar, но и другие менее известные, а также популярные алгоритмы сжатия.

Архивирование в Linux

Важно отметить, что архивирование в linux это не одно и то же что и сжатие файлов linux. Архивирование - это объединение нескольких небольших файлов в один, с целю более удобной последующей передачи, хранения, шифрования или сжатия. Как я уже сказал, архивация выполняется специальными утилитами. Мы не будем трогать архивацию файлов в графическом интерфейсе, вы с ними разберетесь сами, наша тема - терминал.

Самой популярной для Linux утилитой для архивации есть tar. Она используется почти везде, для архивации исходников, упаковки пакетов. Для сжатия используются другие утилиты, в зависимости от алгоритма сжатия, например, zip, bz, xz, lzma и т д. Сначала выполняется архивация, затем сжатие, отдельными программами. Автоматический запуск некоторых утилит сжатия для только что созданного архива поддерживается в tar и других подобных программах с помощью специальных опций.

Также полезной возможностью архивации есть шифрование. Но теперь давайте рассмотрим какие существуют утилиты, с помощью которых выполняется архивирование файлов linux и как ими пользоваться.

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

$ tar опции f файл_для_записи /папка_файлами_для_архива

А теперь разберем основные опции:

  • A - добавить файл к архиву
  • c - создать архив в linux
  • d - сравнить файлы архива и распакованные файлы в файловой системе
  • j - сжать архив с помощью Bzip
  • z - сжать архив с помощью Gzip
  • r - добавить файлы в конец архива
  • t - показать содержимое архива
  • u - обновить архив относительно файловой системы
  • x - извлечь файлы из архива
  • v - показать подробную информацию о процессе работы
  • f - файл для записи архива
  • -C - распаковать в указанную папку
  • --strip-components - отбросить n вложенных папок

Теперь давайте рассмотрим архивирование файлов в Linux. Чтобы создать архив используйте такую команду:

tar -cvf archive.tar.gz /path/to/files

А чтобы распаковать архив tar linux:

tar -xvf archive.tar.gz

Очень просто запомнить для упаковки используется опция c - Create, а для распаковки - x - eXtract.

Сжатый архив создается точно так же, только с опцией -z, это в случае, если использовалось шифрование gizp, если нужно bzip то применяется опция -j:

tar -zcvf archive.tar.gz /path/to/files

$ tar -zxvf archive.tar.gz

Например, рассмотрим как заархивировать папку в Linux:

tar -zcvf home.tar.gz

Хотя можно поступить по-другому, тот же архив мы получим если сначала создать обычный архив с помощью tar, а потом сжать его утилитой для сжатия, только здесь мы получаем больше контроля над процессом сжатия:

Также можно убрать сжатие:

Утилиты сжатия мы рассмотрим ниже.

Чтобы добавить файл в архив используйте:

tar -rvf archive.tar file.txt

Для извлечения одного файла синтаксис тот же:

tar -xvf archive.tar file.txt

Можно извлечь несколько файлов по шаблону соответствия с помощью параметра wildcard, например, извлечем все php файлы:

tar -xvf archive.tar --wildcards '*.php'

По умолчанию распаковать архив tar linux можно в текущую папку с именем архива, чтобы распаковать в нужную папку используйте ключ -C:

tar -xvf archive.tar -C /path/to/dir

Стандартную утилиту рассмотрели, теперь кратко рассмотрим ее альтернативы. Их не так много, и большинство из них уже устаревшие.

Shar позволяет создавать самораспаковывающиеся архивы. По сути, это скрипт оболочки, и для распаковки ему необходима оболочка Bash или другая совместимая с Bourne Shell. У Shar есть несколько преимуществ, но также он потенциально небезопасный, так как архив представляет собой исполняемый файл.

  • -o - сохранять архив в файл вместо стандартного вывода
  • -l - ограничить размер выходного файла
  • -L - ограничить размер выходного файла и разбить его на части
  • -n - имя архива не будет включено в заголовок
  • -a - разрешить автоматическую генерацию заголовков

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

Создаем shar архив:

shar file_name.extension > filename.shar

Распаковываем shar архив:

ar - утилита для создания и управления архивами. В основном используется для архивации статических библиотек, но может быть использована для создания любых архивов. Раньше использовалась довольно часто но была вытеснена утилитой tar. Сейчас используется только для создания и обновления файлов статических библиотек.

  • - d - удалить модули из архива
  • - m - перемещение членов в архиве
  • - p - напечатать специфические члены архива
  • - q - быстрое добавление
  • - r - добавить члена к архиву
  • - s - создать индекс архива
  • - a - добавить новый файл к существующему архиву

Теперь рассмотрим примеры использования. Создадим статическую библиотеку libmath.a из объектных файлов substraction.o и division.o:

ar cr libmath.a substraction.o division.o

Теперь извлечем файлы из архива:

Таким образом, можно распаковать любую статическую библиотеку.

cpio - означает Copy in and out (скопировать ввод и вывод). Это еще один стандартный архиватор для Linux. Активно используется в менеджере пакетов Red Hat, а также для создания initramfs. Архивация в Linux для обычных файлов с помощью этой программы не применяется.

  • -a - сбросить время обращения к файлам после их копирования
  • -A - добавить файл
  • -d - создать каталоги при необходимости

Пример использования. Создаем cpio архив:

file1.o file2.o file3.o

ls | cpio -ov > /path/to/output_folder/obj.cpio

cpio -idv < /path/to folder/obj.cpio

Архивирование папки linux выполняется также само.

Сжатие архивов в Linux

Как создать архив в linux рассмотрели. Теперь давайте поговорим о сжатии. Как я говорил, для сжатия используются специальные утилиты. Рассмотрим кратко несколько из них

Чаще всего применяется Gzip. Это стандартная утилита сжатия в Unix/Linux. Для декомпрессии используется gunzip или gzip -d Сначала рассмотрим ее синтаксис:

$ gzip опции файл

$ gunzip опции файл

Теперь разберем опции:

  • -c - выводить архив в стандартный вывод
  • -d - распаковать
  • -f - принудительно распаковывать или сжимать
  • -l - показать информацию об архиве
  • -r - рекурсивно перебирать каталоги
  • -0 - минимальный уровень сжатия
  • -9 - максимальный уровень сжатия

Примеры использования вы уже видели в описании утилиты tar. Например, выполним сжатие файла:

gzip -c файл > архив.gz

А теперь распакуем:

gunzip -c архив.gz

Но чтобы сжать папку в Linux вам придется сначала заархивировать ее с помощью tar, а уже потом сжать файл архива с помощью gzip.

bzip2 - еще одна альтернативная утилита сжатия для Linux. Она более эффективная чем gzip, но работает медленнее. Для распаковки используйте утилиту bunzip2.

Описывать опции bzip2 я не буду, они аналогичны gzip. Чтобы создать архив в Linux используйте:

В текущем каталоге будет создан файл file.bz2

Новый и высокоэффективный алгоритм сжатия. Синтаксис и опции тоже похожи на Gzip. Для распаковки используйте unlzma.

Еще один высокоэффективный алгоритм сжатия. Обратно совместимый с Lzma. Параметры вызова тоже похожи на Gzip.

Кроссплатформенная утилита для создания сжатых архивов формата zip. Совместимая с Windows реализациями этого алгоритма. Zip архивы очень часто используются для обмена файлами в интернете. С помощью этой утилиты можно сжимать как файлы, так и сжать папку linux.

$ zip опции файлы

$ unzip опции архив

Чтобы создать Zip архив в Linux используйте:

zip -r /path/to/files/*

А для распаковки:

Как видите архивирование zip в Linux не сильно отличается от других форматов.

Выводы

Теперь вы знаете все что нужно об архивации файлов в Linux. Мы рассмотрели только консольные команды, так сказать, чтобы была понятна суть. В графическом интерфейсе все еще проще. Если остались вопросы - задавайте их в комментариях.

ar Это команда сжатия резервных копий в системе Linux, используемая для создания, изменения архивов или извлечения файлов участников из архивов. Файл резервной копии объединяет один или несколько других файлов (файлов-членов) в определенную структуру, а содержимое, режим, отметка времени и другая информация файла-члена будут сохранены в файле резервной копии. Использовать ar Несколько целевых файлов *.o Упакован как файл библиотеки статических ссылок *.a 。

Статическая библиотека - это набор объектных файлов, обычно статическая библиотека с .a Суффикс. Статическая библиотека по программе ar генерировать. Статические библиотеки больше не используются, главным образом потому, что текущие программы обычно используют динамические библиотеки.

1. Создайте библиотеку статических ссылок.

инструменты ar Параметры -r , Вы можете создать библиотеку и вставить целевой файл в указанную библиотеку. Целевой файл обычно является исходным файлом на языке C. *.c Скомпилированный файл *.o 。

Например, команда для упаковки string.o в файл библиотеки libstr.a:

2. Используйте библиотеку статических ссылок.

При компиляции программ часто необходимо использовать библиотеки функций, например, часто используемую стандартную библиотеку C. Библиотечные функции, используемые при компоновке GCC, соответствуют общему формату объектного файла.
Например, функция в libstr.a используется в main.c, а команда для генерации окончательного исполняемого файла main.out выглядит следующим образом:

3. ar - create, modify, and extract from archives

3.1 NAME
ar - create, modify, and extract from archives

3.2 SYNOPSIS
ar [-X32_64] [-]p[mod] [--plugin name] [--target bfdname] [relpos] [count] archive [member. ]

3.3 DESCRIPTION
The GNU ar program creates, modifies, and extracts from archives. An archive is a single file holding a collection of other files in a structure that makes it possible to retrieve the original individual files (called members of the archive).

3.4 --version
Displays the version information of ar and then exits.

3.5 --help
Displays the list of command line options supported by ar and then exits.

3.6 s
Add an index to the archive, or update it if it already exists. Note this command is an exception to the rule that there can only be one command letter, as it is possible to use it as either a command or a modifier. In either case it does the same thing.

3.7 c
Создать файл резервной копии

Create the archive. The specified archive is always created if it did not exist, when you request an update. But a warning is issued unless you specify in advance that you expect to create it, by using this modifier.

Читайте также: