Руководства по командной строке

Man » Онлайн-руководство xz - подробная онлайн-документация для страницы man xz

🌍
xz, unxz, xzcat, lzma, unlzma, lzcat - Сжатие или распаковка файлов .xz и .lzma

СИНТАКСИС

xz [опция...] [файл...]

АЛИАСЫ КОМАНД

unxz эквивалентен xz --decompress.
xzcat эквивалентен xz --decompress --stdout.
lzma эквивалентен xz --format=lzma.
unlzma эквивалентен xz --format=lzma --decompress.
lzcat эквивалентен xz --format=lzma --decompress --stdout.

При написании сценариев, которым необходимо распаковывать файлы, рекомендуется всегда использовать имя xz с соответствующими аргументами (xz -d или xz -dc), а не имена unxz и xzcat.

ОПИСАНИЕ

xz — это универсальный инструмент для сжатия данных с синтаксисом командной строки, аналогичным gzip(1) и bzip2(1). Собственный формат файла — .xz, но также поддерживаются устаревший формат .lzma, используемый LZMA Utils, и необработанные сжатые потоки без заголовков формата контейнера. Кроме того, поддерживается распаковка формата .lz, используемого lzip.

xz сжимает или распаковывает каждый файл в соответствии с выбранным режимом работы. Если файлы не указаны или файл равен -, xz считывает данные из стандартного ввода и записывает обработанные данные в стандартный вывод. xz откажется (отобразит сообщение об ошибке и пропустит файл) записывать сжатые данные в стандартный вывод, если это терминал. Аналогично, xz откажется считывать сжатые данные из стандартного ввода, если это терминал.

Если не указано --stdout, файлы, отличные от -, записываются в новый файл, имя которого получено из исходного имени файла:

При сжатии к имени целевого файла добавляется суффикс формата целевого файла (.xz или .lzma), чтобы получить имя целевого файла.

При распаковке суффиксы .xz, .lzma или .lz удаляются из имени файла, чтобы получить имя целевого файла. xz также распознает суффиксы .txz и .tlz и заменяет их на суффикс .tar.

Если целевой файл уже существует, отображается сообщение об ошибке, и файл пропускается.

Если не выполняется запись в стандартный вывод, xz отобразит предупреждение и пропустит файл, если применимо какое-либо из следующих условий:

Файл не является обычным файлом. Символические ссылки не отслеживаются и, следовательно, не считаются обычными файлами.

Файл имеет более одной жесткой ссылки.

У файла установлены биты setuid, setgid или sticky.

Режим работы установлен в режим сжатия, и файл уже имеет суффикс целевого формата файла (.xz или .txz при сжатии в формат .xz и .lzma или .tlz при сжатии в формат .lzma).

Режим работы установлен в режим распаковки, и файл не имеет суффикса ни одного из поддерживаемых форматов файлов (.xz, .txz, .lzma, .tlz или .lz).

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

После того, как целевой файл был успешно закрыт, исходный файл удаляется, если не была указана опция --keep. Исходный файл никогда не удаляется, если вывод записывается в стандартный вывод или если произошла ошибка.

Отправка сигналов SIGINFO или SIGUSR1 в процесс xz приводит к тому, что он выводит информацию о ходе выполнения в стандартный поток ошибок. Это имеет лишь ограниченное применение, поскольку при использовании терминала в качестве стандартного потока ошибок опция --verbose будет автоматически отображать обновляемый индикатор выполнения.

Использование памяти

Объем памяти, используемый xz, варьируется от нескольких сотен килобайт до нескольких гигабайт в зависимости от параметров сжатия. Параметры, используемые при сжатии файла, определяют требования к памяти распаковщика. Обычно распаковщику требуется от 5% до 20% объема памяти, который был необходим сжимающему процессу при создании файла. Например, для распаковки файла, созданного с помощью xz -9, в настоящее время требуется 65 МБ памяти. Однако возможно, что для распаковки файлов .xz потребуется несколько гигабайт памяти.

Особенно пользователи старых систем могут считать возможность очень большого использования памяти неприятной. Чтобы избежать неприятных сюрпризов, в xz предусмотрен встроенный ограничитель использования памяти, который по умолчанию отключен. Хотя некоторые операционные системы предоставляют способы ограничения использования памяти процессами, полагаться на это не считалось достаточно гибким решением (например, использование ulimit(1) для ограничения виртуальной памяти, как правило, нарушает работу mmap(2)).

Ограничитель использования памяти можно включить с помощью опции командной строки --memlimit=limit. Часто удобнее включить ограничитель по умолчанию, установив переменную среды XZ_DEFAULTS, например, XZ_DEFAULTS=--memlimit=150MiB. Можно установить отдельные ограничения для сжатия и распаковки, используя --memlimit-compress=limit и --memlimit-decompress=limit. Использование этих двух опций вне XZ_DEFAULTS редко бывает полезным, поскольку в одном запуске xz нельзя выполнять как сжатие, так и распаковку, а --memlimit=limit (или -M limit) короче для ввода в командной строке.

Если указанный предел использования памяти превышен при распаковке, xz отобразит ошибку, и распаковка файла завершится с ошибкой. Если предел превышен при сжатии, xz попытается уменьшить параметры, чтобы предел больше не превышался (за исключением использования --format=raw или --no-adjust). Таким образом, операция не завершится ошибкой, если предел не слишком мал. Масштабирование параметров выполняется шагами, которые не соответствуют предустановкам уровней сжатия; например, если предел лишь немного меньше, чем объем памяти, необходимый для xz -9, параметры будут уменьшены лишь немного, а не до xz -8.


Конкатенация и добавление отступов к файлам .xz

Файлы .xz можно объединять без изменений. xz будет распаковывать такие файлы, как если бы это был один файл .xz.

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

Конкатенация и добавление отступов не допускаются для файлов .lzma или необработанных потоков.

ОПЦИИ

Целочисленные суффиксы и специальные значения

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

KiB Умножает целое число на 1024 (2^10). Ki, k, kB, K и KB принимаются как синонимы для KiB.

MiB Умножает целое число на 1 048 576 (2^20). Mi, m, M и MB принимаются как синонимы для MiB.

GiB Умножает целое число на 1 073 741 824 (2^30). Gi, g, G и GB принимаются как синонимы для GiB.

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

Режим работы

Если указано несколько опций режима работы, применяется последняя.

-z, --compress

Сжатие. Это режим работы по умолчанию, когда не указана ни одна опция режима работы и ни один режим работы не подразумевается из имени команды (например, unxz подразумевает --decompress).

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

-d, --decompress, --uncompress

Распаковка. После успешной распаковки исходный файл удаляется, если не выполняется запись в стандартный вывод или не указан параметр --keep.

-t, --test

Проверка целостности сжатых файлов. Эта опция эквивалентна --decompress --stdout, за исключением того, что распакованные данные отбрасываются, а не записываются в стандартный вывод. Файлы не создаются и не удаляются.

-l, --list

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

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


Точный вывод может отличаться в зависимости от версий xz и используемых локалей. Для получения машиночитаемого вывода следует использовать параметры --robot и --list.

Модификаторы операций

-k, --keep

Не удалять входные файлы.

Начиная с xz 5.2.6, эта опция также позволяет xz сжимать или распаковывать, даже если входной файл является символической ссылкой на обычный файл, имеет более одной жесткой ссылки или установлены биты setuid, setgid или sticky. Биты setuid, setgid и sticky не копируются в целевой файл. В более ранних версиях это выполнялось только с помощью --force.

-f, --force

Эта опция имеет несколько эффектов:

Если целевой файл уже существует, он удаляется перед сжатием или распаковкой.

Сжимать или распаковывать, даже если входной файл является символической ссылкой на обычный файл, имеет более одной жесткой ссылки или установлены биты setuid, setgid или sticky. Биты setuid, setgid и sticky не копируются в целевой файл.

При использовании с параметрами --decompress и --stdout и если xz не может определить тип исходного файла, исходный файл копируется как есть в стандартный вывод. Это позволяет использовать xzcat --force как [cat]({filename}../../cat)(1) для файлов, которые не были сжаты с помощью xz. Обратите внимание, что в будущем xz может поддерживать новые форматы сжатых файлов, из-за чего xz может распаковывать больше типов файлов, а не просто копировать их в стандартный вывод. Параметр --format=format можно использовать, чтобы ограничить xz распаковкой только одного формата файлов.

-c, --stdout, --to-stdout

Записывать сжатые или распакованные данные в стандартный вывод, а не в файл. Это подразумевает --keep.

--single-stream

Распаковывать только первый поток .xz и игнорировать любые последующие данные ввода. Обычно при наличии таких завершающих мусорных данных xz отображает ошибку.

xz никогда не распаковывает более одного потока из файлов .lzma или необработанных потоков, но эта опция все равно заставляет xz игнорировать возможные завершающие данные после файла .lzma или необработанного потока.

Эта опция не имеет эффекта, если режим операции не установлен в --decompress или --test.

Начиная с xz 5.7.1alpha, --single-stream подразумевает --keep.

--no-sparse

Отключить создание разреженных файлов. По умолчанию, при распаковке в обычный файл, xz пытается сделать файл разреженным, если распакованные данные содержат длинные последовательности двоичных нулей. Это также работает при записи в стандартный вывод, если стандартный вывод подключен к обычному файлу и выполняются определенные дополнительные условия для обеспечения безопасности. Создание разреженных файлов может сэкономить дисковое пространство и ускорить распаковку за счет уменьшения объема дисковых операций ввода-вывода.

-S .suf, --suffix=.suf

При сжатии использовать .suf в качестве суффикса для целевого файла вместо .xz или .lzma. Если не записывается в стандартный вывод и исходной файл уже имеет суффикс .suf, отображается предупреждение и файл пропускается.

При распаковке распознавать файлы с суффиксом .suf в дополнение к файлам с суффиксами .xz, .txz, .lzma, .tlz или .lz. Если исходный файл имеет суффикс .suf, суффикс удаляется, чтобы получить имя целевого файла.


При сжатии или распаковке необработанных потоков (--format=raw) суффикс всегда должен быть указан, если только данные не записываются в стандартный вывод, поскольку для необработанных потоков нет суффикса по умолчанию.

--files[=file]

Считывает имена файлов для обработки из файла; если файл не указан, имена файлов считываются из стандартного ввода. Имена файлов должны заканчиваться символом новой строки. Дефис (-) интерпретируется как обычное имя файла; он не означает стандартный ввод. Если имена файлов также указаны в качестве аргументов командной строки, они обрабатываются перед именами файлов, считанными из файла.

--files0[=file]

Идентично --files[=file], за исключением того, что каждое имя файла должно заканчиваться нулевым символом.

Основные параметры формата файла и сжатия

-F format, --format=format

Укажите формат файла для сжатия или распаковки:

auto   Это значение по умолчанию. При сжатии auto эквивалентно xz. При распаковке формат входного файла определяется автоматически. Обратите внимание, что необработанные потоки (созданные с помощью --format=raw) не могут быть автоматически определены.

xz     Сжимать в формат файла .xz или принимать только файлы .xz при распаковке.

lzma, alone

Сжимать в устаревший формат файла .lzma или принимать только файлы .lzma при распаковке. Альтернативное имя alone предоставлено для обратной совместимости с LZMA Utils.

lzip   Принимать только файлы .lz при распаковке. Сжатие не поддерживается.

Поддерживаются версии формата .lz 0 и 1. Файлы версии 0 создавались lzip 1.3 и более ранними версиями. Такие файлы встречаются редко, но их можно найти в файловых архивах, поскольку несколько исходных пакетов были выпущены в этом формате. У людей также могут быть старые личные файлы в этом формате. Поддержка распаковки формата версии 0 была удалена в lzip 1.18. lzip 1.4 и более поздние версии создают файлы в формате версии 1.

raw    Сжимать или распаковывать необработанный поток (без заголовков). Это предназначено только для опытных пользователей. Для декодирования необработанных потоков необходимо использовать --format=raw и явно указать цепочку фильтров, которая обычно хранится в заголовках контейнера.

-C check, --check=check

Укажите тип проверки целостности. Проверка вычисляется на основе несжатых данных и сохраняется в файле .xz. Этот параметр имеет эффект только при сжатии в формат .xz; формат .lzma не поддерживает проверки целостности. Проверка целостности (если она есть) выполняется при распаковке файла .xz.

Поддерживаемые типы проверок:

none   Не вычислять проверку целостности вообще. Обычно это плохая идея. Это может быть полезно, когда целостность данных проверяется другими средствами.

crc32  Вычислить CRC32, используя полином из IEEE-802.3 (Ethernet).

crc64  Вычислить CRC64, используя полином из ECMA-182. Это значение по умолчанию, поскольку оно немного лучше, чем CRC32, в обнаружении поврежденных файлов, и разница в скорости незначительна.

sha256 Вычисление SHA-256. Это несколько медленнее, чем CRC32 и CRC64.

Целостность заголовков .xz всегда проверяется с помощью CRC32. Изменить или отключить это невозможно.

--ignore-check

Не выполнять проверку целостности сжатых данных при распаковке. Значения CRC32 в заголовках .xz будут по-прежнему проверяться как обычно.

Не используйте эту опцию, если не знаете, что делаете. Возможные причины использования этой опции:

Попытка восстановления данных из поврежденного файла .xz.

Ускорение распаковки. Это особенно важно при использовании SHA-256 или для файлов, которые очень хорошо сжимаются. Не рекомендуется использовать эту опцию для этой цели, если целостность файла не проверяется внешним способом.

-0 ... -9
Выберите уровень сжатия. По умолчанию используется -6. Если указано несколько уровней, применяется последний. Если уже указана пользовательская цепочка фильтров, установка уровня сжатия очищает пользовательскую цепочку фильтров.

Различия между уровнями более значительны, чем в [gzip]({filename}../../gzip)(1) и [bzip2]({filename}bzip2.md)(1). Выбранные параметры сжатия определяют требования к памяти декомпрессора, поэтому использование слишком высокого уровня может затруднить распаковку файла на старой системе с небольшим объемом оперативной памяти. В частности, не стоит бездумно использовать -9 для всего, как это часто делают с [gzip]({filename}../../gzip)(1) и [bzip2]({filename}bzip2.md)(1).

-0 ... -3
Это относительно быстрые уровни. -0 иногда быстрее, чем gzip -9, при этом сжатие происходит намного лучше. Более высокие уровни часто имеют скорость, сравнимую со скоростью [bzip2]({filename}bzip2.md)(1), и сравнимое или лучшее соотношение сжатия, хотя результаты сильно зависят от типа сжимаемых данных.

-4 ... -6
Хорошее и очень хорошее сжатие при сохранении разумного объема памяти декомпрессора, даже для старых систем. -6 — это значение по умолчанию, которое обычно является хорошим выбором для распространения файлов, которые должны быть распакованы даже на системах с 16 МБ оперативной памяти. (-5e или -6e также могут быть полезны. См. --extreme.)

-7 ... -9
Это похоже на -6, но с более высокими требованиями к памяти компрессора и декомпрессора. Они полезны только при сжатии файлов размером более 8 МБ, 16 МБ и 32 МБ соответственно.

На одном и том же оборудовании скорость распаковки примерно постоянна: количество байтов сжатых данных в секунду. Другими словами, чем лучше сжатие, тем быстрее обычно будет распаковка. Это также означает, что объем несжатых выходных данных, производимых в секунду, может сильно различаться.

В следующей таблице обобщены характеристики уровней:

Preset   DictSize   CompCPU   CompMem   DecMem
    -0     256 KiB       0        3 MiB    1 MiB
    -1       1 MiB       1        9 MiB    2 MiB
    -2       2 MiB       2       17 MiB    3 MiB
    -3       4 MiB       3       32 MiB    5 MiB
    -4       4 MiB       4       48 MiB    5 MiB
    -5       8 MiB       5       94 MiB    9 MiB
    -6       8 MiB       6       94 MiB    9 MiB
    -7      16 MiB       6      186 MiB   17 MiB
    -8      32 MiB       6      370 MiB   33 MiB
    -9      64 MiB       6      674 MiB   65 MiB

Описание столбцов:

DictSize — размер словаря LZMA2. Использовать словарь, превышающий размер несжатого файла, нецелесообразно, так как это приводит к неэффективному использованию памяти. Поэтому желательно избегать использования пресетов -7…-9, если в этом нет реальной необходимости. При значениях -6 и ниже объем используемой памяти обычно незначителен и не вызывает проблем.

CompCPU — упрощенное представление настроек LZMA2, влияющих на скорость сжатия. Размер словаря также влияет на скорость, поэтому, хотя значения CompCPU одинаковы для уровней -6…-9, более высокие уровни, как правило, немного медленнее. Для еще большей скорости и, следовательно, потенциально лучшего сжатия см. параметр --extreme.

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

DecMem содержит требования к памяти декомпрессора. То есть, настройки сжатия определяют требования к памяти декомпрессора. Фактический объем памяти, используемый декомпрессором, немного превышает размер словаря LZMA2, но значения в таблице округлены до ближайшего полного МБ.

Требования к памяти в многопоточном режиме значительно выше, чем в однопоточном. При значении по умолчанию для параметра --block-size каждому потоку требуется 3 * 3 * DictSize плюс CompMem или DecMem. Например, для четырех потоков с пресетом -6 требуется 660–670 МБ памяти.

-e, --extreme

Использовать более медленный вариант выбранного пресета сжатия (-0…-9) в надежде получить немного лучшее соотношение сжатия, но, к сожалению, это также может привести к ухудшению результатов. На использование памяти декомпрессором это не влияет, но требования к памяти компрессора немного возрастают для пресетов -0…-3.

Поскольку существует два пресета с размером словаря 4 МБ и 8 МБ, пресеты -3e и -5e используют немного более быстрые настройки (более низкий CompCPU), чем -4e и -6e соответственно. Таким образом, ни два пресета не идентичны.

Пресет DictSize CompCPU CompMem DecMem -0e 256 КБ 8 4 МБ 1 МБ -1e 1 МБ 8 13 МБ 2 МБ -2e 2 МБ 8 25 МБ 3 МБ -3e 4 МБ 7 48 МБ 5 МБ -4e 4 МБ 8 48 МБ 5 МБ -5e 8 МБ 7 94 МБ 9 МБ -6e 8 МБ 8 94 МБ 9 МБ -7e 16 МБ 8 186 МБ 17 МБ -8e 32 МБ 8 370 МБ 33 МБ -9e 64 МБ 8 674 МБ 65 МБ

Например, существует в общей сложности четыре пресета, использующие словарь размером 8 МБ, порядок которых от самого быстрого до самого медленного: -5, -6, -5e и -6e.

--fast
--best Это несколько вводящие в заблуждение псевдонимы для -0 и -9 соответственно. Они предоставляются только для обеспечения обратной совместимости с LZMA Utils. Не используйте эти параметры.

--block-size=size

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

В многопоточном режиме в каждом потоке выделяется примерно в три раза больше байт для буферизации входных и выходных данных. Размер по умолчанию — в три раза больше размера словаря LZMA2 или 1 МБ, в зависимости от того, что больше. Обычно хорошее значение составляет 2–4 раза больше размера словаря LZMA2 или, по крайней мере, 1 МБ. Использование размера, меньшего размера словаря LZMA2, нецелесообразно, поскольку буфер словаря LZMA2 никогда не будет полностью использован. В многопоточном режиме размеры блоков хранятся в заголовках блоков. Эта информация о размере необходима для многопоточной декомпрессии.

В однопоточном режиме разделение на блоки не выполняется по умолчанию. Установка этой опции не влияет на использование памяти. Информация о размере не хранится в заголовках блоков, поэтому файлы, созданные в однопоточном режиме, не будут идентичны файлам, созданным в многопоточном режиме. Отсутствие информации о размере также означает, что xz не сможет распаковывать эти файлы в многопоточном режиме.

--block-list=items При сжатии в формат .xz начните новый блок с необязательной пользовательской цепочкой фильтров после заданных интервалов несжатых данных.

Элементы представляют собой список, разделенный запятыми. Каждый элемент состоит из необязательного номера цепочки фильтров от 0 до 9, за которым следует двоеточие (:) и обязательный размер несжатых данных. Пропуск элемента (две или более последовательные запятые) является сокращенной формой для использования размера и фильтров предыдущего элемента.

Если входной файл больше суммы размеров в элементах, последний элемент повторяется до конца файла. Специальное значение 0 можно использовать в качестве последнего размера, чтобы указать, что остальная часть файла должна быть закодирована как один блок.

Альтернативную цепочку фильтров для каждого блока можно указать в сочетании с опциями --filters1=filters ... --filters9=filters. Эти опции определяют цепочки фильтров с идентификатором от 1 до 9. Цепочку фильтров 0 можно использовать для ссылки на цепочку фильтров по умолчанию, которая эквивалентна отсутствию указания цепочки фильтров. Идентификатор цепочки фильтров можно использовать перед размером несжатых данных, за которым следует двоеточие (:). Например, если указать --block-list=1:2MiB,3:2MiB,2:4MiB,,2MiB,0:4MiB, то блоки будут создаваться с использованием:

Цепочки фильтров, указанной в --filters1, и 2 МБ входных данных.

Цепочки фильтров, указанной в --filters3, и 2 МБ входных данных.

Цепочки фильтров, указанной в --filters2, и 4 МБ входных данных.

Цепочки фильтров, указанной в --filters2, и 4 МБ входных данных.

Цепочки фильтров по умолчанию и 2 МБ входных данных.

Цепочки фильтров по умолчанию и 4 МБ входных данных для каждого блока до конца входных данных.

Если указать размер, превышающий размер блока кодировщика (либо значение по умолчанию в многопоточном режиме, либо значение, указанное с помощью --block-size=size), кодировщик создаст дополнительные блоки, сохраняя при этом границы, указанные в элементах. Например, если указать --block-size=10MiB --block-list=5MiB,10MiB,8MiB,12MiB,24MiB, и входной файл составляет 80 МБ, то получится 11 блоков: 5, 10, 8, 10, 2, 10, 10, 4, 10, 10 и 1 МБ.


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

--flush-timeout=таймаут

При сжатии, если с момента предыдущей операции сброса прошло больше указанного количества миллисекунд (положительное целое число), и дальнейшее чтение входных данных привело бы к блокировке, все ожидающие входные данные сбрасываются из кодировщика и становятся доступными в выходном потоке. Это может быть полезно, если xz используется для сжатия данных, передаваемых по сети. Небольшие значения таймаута делают данные доступными на принимающей стороне с небольшой задержкой, но большие значения таймаута обеспечивают лучшее соотношение сжатия.

Эта функция отключена по умолчанию. Если этот параметр указан несколько раз, применяется последний из них. Специальное значение таймаута 0 можно использовать, чтобы явно отключить эту функцию.

Эта функция недоступна в не-POSIX системах.

Эта функция все еще находится в стадии разработки. В настоящее время xz не подходит для декомпрессии потока в реальном времени из-за того, как xz выполняет буферизацию.

--no-sync

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

Этот параметр имеет эффект только в том случае, если xz собирается удалить исходный файл. В других случаях синхронизация никогда не выполняется.

Синхронизация и --no-sync были добавлены в xz 5.7.1alpha.

--memlimit-compress=лимит

Установите ограничение на использование памяти для сжатия. Если этот параметр указан несколько раз, применяется последний из них.

Если настройки сжатия превышают лимит, xz попытается скорректировать настройки в сторону уменьшения, чтобы лимит больше не превышался, и отобразит уведомление о том, что была выполнена автоматическая корректировка. Корректировки выполняются в следующем порядке: уменьшение количества потоков, переход в однопоточный режим, если даже один поток в многопоточном режиме превышает лимит, и, наконец, уменьшение размера словаря LZMA2.

При сжатии с использованием --format=raw или если указан параметр --no-adjust, уменьшается только количество потоков, поскольку это можно сделать без изменения сжатого вывода.

Если лимит не может быть достигнут даже с описанными выше корректировками, отображается сообщение об ошибке, и xz завершает работу с кодом выхода 1.


Предел может быть указан несколькими способами:

Предел может быть указан в виде абсолютного значения в байтах. Использование целочисленного суффикса, например MiB, может быть полезным. Пример: --memlimit-compress=80MiB

Предел можно указать в процентах от общего объема физической памяти (RAM). Это может быть полезно, особенно при установке переменной среды XZ_DEFAULTS в скрипте инициализации оболочки, который используется на разных компьютерах. Таким образом, предел автоматически будет больше на системах с большим объемом памяти. Пример: --memlimit-compress=70%

Предел можно сбросить до значения по умолчанию, установив его в 0. В настоящее время это эквивалентно установке предела на максимум (без ограничения использования памяти).

Для 32-битной версии xz существует особый случай: если предел превышает 4020 MiB, предел устанавливается на 4020 MiB. Для MIPS32 используется 2000 MiB. (Значения 0 и «макс.» не подвержены этому. Аналогичная функция не существует для декомпрессии.) Это может быть полезно, когда 32-битное исполняемое приложение имеет доступ к 4-ГБ адресному пространству (2-ГБ для MIPS32) и, возможно, не наносит вреда в других ситуациях.

См. также раздел «Использование памяти».

--memlimit-decompress=limit

Устанавливает предел использования памяти для декомпрессии. Это также влияет на режим --list. Если операция невозможна без превышения предела, xz отобразит ошибку и декомпрессия файла завершится неудачей. См. --memlimit-compress=limit для возможных способов указания предела.

--memlimit-mt-decompress=limit

Устанавливает предел использования памяти для многопоточной декомпрессии. Это может повлиять только на количество потоков; это никогда не приведет к тому, что xz откажется декомпрессировать файл. Если предел слишком низок для использования многопоточности, предел игнорируется, и xz продолжит работу в однопоточном режиме. Обратите внимание, что если также используется --memlimit-decompress, он всегда будет применяться как к однопоточному, так и к многопоточному режимам, и, следовательно, фактический предел для многопоточности никогда не будет выше предела, установленного с помощью --memlimit-decompress.

В отличие от других параметров ограничения использования памяти, --memlimit-mt-decompress=limit имеет системно-специфичный предел по умолчанию. Команда xz --info-memory может быть использована для просмотра текущего значения.

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

См. --memlimit-compress=limit для возможных способов указания предела. Установка предела в 0 сбрасывает предел до значения по умолчанию, специфичного для системы.

-M limit, --memlimit=limit, --memory=limit

Это эквивалентно указанию --memlimit-compress=limit --memlimit-decompress=limit --memlimit-mt-decompress=limit.


--no-adjust

Выводит сообщение об ошибке и завершает работу, если не удается удовлетворить ограничение на использование памяти без изменения настроек, влияющих на сжатый вывод. То есть, это предотвращает переключение xz из многопоточного режима в однопоточный и уменьшение размера словаря LZMA2. Даже при использовании этого параметра количество потоков может быть уменьшено для соответствия ограничению использования памяти, поскольку это не повлияет на сжатый вывод.

Автоматическая настройка всегда отключается при создании необработанных потоков (--format=raw).

-T threads, --threads=threads

Укажите количество рабочих потоков для использования. Установка значения threads равным специальному значению 0 заставляет xz использовать до тех пор, пока это поддерживается процессорами в системе. Фактическое количество потоков может быть меньше указанного, если входной файл недостаточно велик для многопоточной обработки с заданными настройками или если использование большего количества потоков превысит ограничение на использование памяти.

Однопоточный и многопоточный компрессоры создают разный вывод. Однопоточный компрессор обеспечивает наименьший размер файла, но только вывод из многопоточного компрессора можно распаковать с использованием нескольких потоков. Установка значения threads равным 1 использует однопоточный режим. Установка любого другого значения, включая 0, использует многопоточный компрессор, даже если система поддерживает только один аппаратный поток. (В xz 2.x в этой ситуации использовался однопоточный режим).

Чтобы использовать многопоточный режим с одним потоком, установите threads равным +1. Префикс + не имеет эффекта для других значений. Ограничение на использование памяти все равно может привести к переключению xz в однопоточный режим, если не используется --no-adjust. Поддержка префикса + была добавлена в xz 5.4.0.

Если запрошено автоматическое количество потоков и не указано ограничение на использование памяти, то для возможного ограничения количества потоков будет использоваться системно-специфическое значение по умолчанию. Это "мягкое" ограничение в том смысле, что оно игнорируется, если количество потоков становится равным одному, поэтому "мягкое" ограничение никогда не помешает xz сжимать или распаковывать данные. Это ограничение по умолчанию не приведет к переключению xz из многопоточного режима в однопоточный. Активные ограничения можно увидеть с помощью xz --info-memory.

В настоящее время единственный метод потоковой обработки — разделение входных данных на блоки и их независимая компрессия. Размер блока по умолчанию зависит от уровня сжатия и может быть изменен с помощью опции --block-size=size.

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

Значение по умолчанию для threads равно 0. В xz 5.4.x и более ранних версиях значение по умолчанию равно 1.

Пользовательские цепочки фильтров компрессора

Пользовательская цепочка фильтров позволяет подробно указывать настройки сжатия вместо использования настроек, связанных с предустановками. Когда указана пользовательская цепочка фильтров, все параметры предустановок (-0 ... -9 и --extreme), указанные ранее в командной строке, игнорируются. Если параметр предустановки указан после одного или нескольких параметров пользовательской цепочки фильтров, новая предустановка вступает в силу, и параметры пользовательской цепочки фильтров, указанные ранее, игнорируются.


Цепочка фильтров аналогична конвейеру в командной строке. При сжатии несжатые входные данные передаются в первый фильтр, выход которого передается в следующий фильтр (если он есть). Выход последнего фильтра записывается в сжатый файл. Максимальное количество фильтров в цепочке равно четырем, но обычно цепочка фильтров содержит один или два фильтра.

У многих фильтров есть ограничения на то, где они могут находиться в цепочке фильтров: некоторые фильтры могут работать только как последний фильтр в цепочке, некоторые — только как фильтр, не являющийся последним, а некоторые работают в любой позиции в цепочке. В зависимости от фильтра, это ограничение либо присуще конструкции фильтра, либо существует для предотвращения проблем с безопасностью.

Настраиваемую цепочку фильтров можно указать двумя разными способами. Параметры `--filters=filters` и `--filters1=filters ... --filters9=filters` позволяют указать всю цепочку фильтров в одном параметре, используя синтаксис строки фильтров liblzma. Кроме того, цепочку фильтров можно указать с помощью одного или нескольких отдельных параметров фильтров в том порядке, в котором они должны быть в цепочке фильтров. То есть порядок отдельных параметров фильтров имеет значение! При декодировании необработанных потоков (`--format=raw`), цепочка фильтров должна быть указана в том же порядке, что и при сжатии. Любые отдельные параметры фильтров или предустановки, указанные перед параметром полной цепочки (`--filters=filters`), будут забыты. Отдельные фильтры, указанные после параметра полной цепочки, перезагрузят цепочку фильтров.

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

Чтобы увидеть всю цепочку фильтров и параметры, используйте `xz -vv` (то есть используйте `--verbose` дважды). Это также работает для просмотра параметров цепочки фильтров, используемых предустановками.

`--filters=filters`

Укажите полную цепочку фильтров или предустановку в одном параметре. Каждый фильтр можно разделить пробелами или двумя дефисами (--). Параметр filters может потребоваться заключить в кавычки в командной строке оболочки, чтобы он интерпретировался как один параметр. Чтобы указать параметры, используйте : или =. Предустановка может быть префиксирована символом - и за ней могут следовать один или несколько флагов. Единственный поддерживаемый флаг — e, который применяет те же параметры, что и --extreme.

`--filters1=filters ... --filters9=filters`

Укажите до девяти дополнительных цепочек фильтров, которые можно использовать с --block-list.

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

--filters-help

Отображает сообщение справки, описывающее, как указывать предустановки и пользовательские цепочки фильтров в опциях --filters и --filters1=filters ... --filters9=filters, и успешно завершает работу.

--lzma1[=options]
--lzma2[=options]

Добавляет фильтр LZMA1 или LZMA2 в цепочку фильтров. Эти фильтры могут использоваться только в качестве последнего фильтра в цепочке.

LZMA1 — устаревший фильтр, который поддерживается почти исключительно из-за устаревшего формата файлов .lzma, который поддерживает только LZMA1. LZMA2 — обновленная версия LZMA1, предназначенная для устранения некоторых практических проблем LZMA1. Формат .xz использует LZMA2 и не поддерживает LZMA1. Скорость и степень сжатия LZMA1 и LZMA2 практически одинаковы.

LZMA1 и LZMA2 используют один и тот же набор опций:

preset=preset

Сбрасывает все опции LZMA1 или LZMA2 к предустановке. Предустановка состоит из целого числа, за которым может следовать одиночный буквенный модификатор предустановки. Целое число может быть от 0 до 9, что соответствует параметрам командной строки -0 ... -9. Единственный поддерживаемый в настоящее время модификатор — это e, что соответствует --extreme. Если предустановка не указана, значения по умолчанию для опций LZMA1 или LZMA2 берутся из предустановки 6.

dict=size

Размер словаря (буфера истории) указывает, сколько байтов недавно обработанных несжатых данных хранится в памяти. Алгоритм пытается найти повторяющиеся последовательности байтов (совпадения) в несжатых данных и заменить их ссылками на данные, которые в настоящее время находятся в словаре. Чем больше словарь, тем выше вероятность найти совпадение. Таким образом, увеличение размера словаря обычно улучшает степень сжатия, но словарь, превышающий размер несжатого файла, — это пустая трата памяти.

Типичный размер словаря составляет от 64 КБ до 64 МБ. Минимальный размер — 4 КБ. Максимальный размер для сжатия в настоящее время составляет 1,5 ГБ (1536 МБ). Декомпрессор уже поддерживает словари, размер которых на один байт меньше 4 ГБ, что является максимальным размером для форматов потоков LZMA1 и LZMA2.

Размер словаря и алгоритм поиска совпадений (mf) вместе определяют использование памяти кодировщика LZMA1 или LZMA2. Для декомпрессии требуется такой же (или больший) размер словаря, который использовался при сжатии, следовательно, использование памяти декодера определяется размером словаря, используемым при сжатии. Заголовки .xz хранят размер словаря либо как 2^n, либо как 2^n + 2^(n-1), поэтому эти размеры предпочтительны для сжатия. Другие размеры будут округлены при хранении в заголовках .xz.

lc=lc Укажите количество битов контекста литералов. Минимальное значение — 0, максимальное — 4; по умолчанию — 3. Кроме того, сумма lc и lp не должна превышать 4.

Все байты, которые не могут быть закодированы в виде совпадений, кодируются как литералы. То есть литералы — это просто 8-битные байты, которые кодируются по одному.

Кодирование литералов основано на предположении, что старшие lc битов предыдущего несжатого байта коррелируют со следующим байтом. Например, в обычном английском тексте прописная буква часто следует за строчной буквой, а строчная буква обычно следует за другой строчной буквой. В наборе символов US-ASCII старшие три бита — 010 для прописных букв и 011 для строчных букв. Если lc составляет как минимум 3, кодирование литералов может использовать это свойство в несжатых данных.

Значение по умолчанию (3) обычно подходит. Если требуется максимальное сжатие, попробуйте lc=4. Иногда это немного помогает, а иногда ухудшает сжатие. Если ухудшает, попробуйте также lc=2.

lp=lp Укажите количество битов для кодирования позиции литерала. Минимум – 0, максимум – 4, значение по умолчанию – 0.

Параметр lp влияет на то, какое выравнивание данных предполагается при кодировании литералов. Подробности о выравнивании см. в описании параметра pb.

pb=pb Укажите количество битов позиции. Минимум – 0, максимум – 4, значение по умолчанию – 2.

Параметр pb влияет на то, какое выравнивание данных предполагается в общем случае. Значение по умолчанию означает выравнивание по 4 байта (2^pb = 2^2 = 4), что часто является хорошим выбором, если нет более точной информации.

Если выравнивание известно, установка значения pb в соответствии с ним может немного уменьшить размер файла. Например, для текстовых файлов с выравниванием по 1 байту (US-ASCII, ISO-8859-*, UTF-8) установка pb=0 может немного улучшить сжатие. Для текста UTF-16 хорошим выбором будет pb=1. Если выравнивание является нечетным числом байт, например 3, лучшим выбором может быть pb=0.

Хотя предполагаемое выравнивание можно настроить с помощью параметров pb и lp, алгоритмы LZMA1 и LZMA2 все равно в некоторой степени отдают предпочтение выравниванию по 16 байт. Это стоит учитывать при разработке форматов файлов, которые, вероятно, часто будут сжиматься с помощью LZMA1 или LZMA2.

mf=mf Метод поиска совпадений оказывает существенное влияние на скорость кодирования, использование памяти и степень сжатия. Как правило, метод поиска совпадений на основе хэш-цепочки быстрее, чем метод поиска совпадений на основе двоичного дерева. Значение по умолчанию зависит от предустановки: 0 использует hc3, 1–3 используют hc4, а остальные используют bt4.

Поддерживаются следующие методы поиска совпадений. Формулы для оценки использования памяти, приведенные ниже, являются приблизительными и наиболее точно отражают реальность, когда dict является степенью двойки.

hc3 Хэш-цепочка с 2- и 3-байтным хэшированием
Минимальное значение для nice: 3
Использование памяти:
dict * 7.5 (если dict <= 16 МБ);
dict * 5.5 + 64 МБ (если dict > 16 МБ)

hc4 Хэш-цепочка с 2-, 3- и 4-байтным хэшированием
Минимальное значение для nice: 4
Использование памяти:
dict * 7.5 (если dict <= 32 МБ);
dict * 6.5 (если dict > 32 МБ)

bt2 Двоичное дерево с 2-байтным хэшированием
Минимальное значение для nice: 2
Использование памяти: dict * 9.5

bt3 Двоичное дерево с 2- и 3-байтным хэшированием
Минимальное значение для nice: 3
Использование памяти:
dict * 11.5 (если dict <= 16 МБ);
dict * 9.5 + 64 МБ (если dict > 16 МБ)

bt4 Двоичное дерево с 2-, 3- и 4-байтным хэшированием
Минимальное значение для nice: 4
Использование памяти:
dict * 11.5 (если dict <= 32 МБ);
dict * 10.5 (если dict > 32 МБ)

mode=mode

Параметр compression_mode указывает метод, используемый для анализа данных, полученных из модуля поиска совпадений. Поддерживаемые режимы: fast и normal. По умолчанию для предустановок 0–3 используется режим fast, а для предустановок 4–9 — режим normal.

Обычно режим fast используется с модулями поиска совпадений Hash Chain, а режим normal — с модулями Binary Tree. То же самое делается и в предустановках.

nice=nice

Указывает минимальную длину совпадения, которая считается приемлемой. Как только будет найдено совпадение длиной не менее nice байт, алгоритм прекращает поиск потенциально лучших совпадений.

Значение nice может быть от 2 до 273 байт. Более высокие значения, как правило, обеспечивают лучшее сжатие, но за счет скорости. Значение по умолчанию зависит от предустановки.

depth=depth

Указывает максимальную глубину поиска в модуле поиска совпадений. Значение по умолчанию — специальное значение 0, при котором компрессор определяет разумную глубину на основе параметров mf и nice.

Разумная глубина для Hash Chains составляет 4–100, а для Binary Trees — 16–1000. Использование очень высоких значений для depth может значительно замедлить работу кодировщика для некоторых файлов. Не следует устанавливать значение depth больше 1000, если вы не готовы прервать сжатие, если оно занимает слишком много времени.

При декодировании необработанных потоков (--format=raw), LZMA2 требуется только размер словаря. LZMA1 также требует значения lc, lp и pb.

--x86[=options]
--arm[=options]
--armthumb[=options]
--arm64[=options]
--powerpc[=options]
--ia64[=options]
--sparc[=options]
--riscv[=options]

Добавляет фильтр ветвлений/вызовов/переходов (BCJ) в цепочку фильтров. Эти фильтры можно использовать только в качестве последнего фильтра в цепочке фильтров.

Фильтр BCJ преобразует относительные адреса в машинном коде в их абсолютные аналоги. Это не изменяет размер данных, но увеличивает избыточность, что может помочь LZMA2 создать файл .xz на 0–15 % меньше. Фильтры BCJ всегда обратимы, поэтому использование фильтра BCJ для неправильного типа данных не приводит к потере данных, хотя это может немного ухудшить коэффициент сжатия. Фильтры BCJ очень быстрые и используют незначительное количество памяти.

Эти фильтры BCJ имеют известные проблемы, связанные с коэффициентом сжатия:

Некоторые типы файлов, содержащих исполняемый код (например, объектные файлы, статические библиотеки и модули ядра Linux), содержат адреса в инструкциях, заполненные фиктивными значениями. Эти фильтры BCJ все равно будут выполнять преобразование адресов, что ухудшит сжатие для этих файлов.

Если фильтр BCJ применяется к архиву, то вполне возможно, что он ухудшит коэффициент сжатия по сравнению с тем, если фильтр BCJ не используется. Например, если в архиве есть похожие или даже идентичные исполняемые файлы, фильтрация, скорее всего, сделает файлы менее похожими, и, следовательно, сжатие будет хуже. Содержимое неисполняемых файлов в том же архиве также может иметь значение. На практике необходимо попробовать с фильтром BCJ и без него, чтобы увидеть, что лучше в каждой конкретной ситуации.

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


Фильтр Выравнивание Примечания x86 1 32-разрядный или 64-разрядный x86 ARM 4 ARM-Thumb 2 ARM64 4 Лучше всего использовать выравнивание в 4096 байт PowerPC 4 Только big endian IA-64 16 Itanium SPARC 4 RISC-V 2

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

Фильтр IA-64 имеет выравнивание в 16 байт, поэтому pb=4, lp=4, lc=0 хорошо подходят для LZMA2 (2^4=16).

Код RISC-V имеет выравнивание в 2 или 4 байта, в зависимости от того, содержит ли файл
16-битные сжатые инструкции (расширение C). Когда используются 16-битные инструкции,
pb=2, lp=1, lc=3 или pb=1, lp=1, lc=3 — хороший выбор. Когда 16-битные инструкции отсутствуют,
pb=2, lp=2, lc=2 — лучший выбор. Команда `readelf -h` может быть использована для проверки наличия "RVC" в строке "Flags".

ARM64 всегда выравнивается по 4 байта, поэтому pb=2, lp=2, lc=2 — лучший выбор.

Фильтр x86 является исключением. Обычно лучше придерживаться параметров LZMA2 по умолчанию
(pb=2, lp=0, lc=3) при сжатии исполняемых файлов x86.

Все фильтры BCJ поддерживают одни и те же опции:

start=offset
Укажите начальное смещение, которое используется при преобразовании между относительными и абсолютными
адресами. Смещение должно быть кратно выравниванию фильтра (см. таблицу выше). По умолчанию — ноль. На практике, значение по умолчанию подходит; указание пользовательского смещения почти никогда не бывает полезным.

--delta[=options]
Добавьте фильтр Delta в цепочку фильтров. Фильтр Delta может использоваться только как последний фильтр в цепочке фильтров.

В настоящее время поддерживается только простая побайтовая дельта-вычислительная операция. Это может быть полезно при сжатии, например, несжатых растровых изображений или несжатого PCM-аудио. Однако, специализированные алгоритмы могут давать значительно лучшие результаты, чем Delta + LZMA2. Это особенно верно для аудио, которое сжимается быстрее и лучше, например, с помощью flac(1).

Поддерживаемые опции:

dist=distance
Укажите расстояние для дельта-вычисления в байтах. distance должно быть от 1 до 256.
Значение по умолчанию — 1.

Например, при dist=2 и восьмибайтовом вводе A1 B1 A2 B3 A3 B5 A4 B7, вывод будет следующим:
A1 B1 01 02 01 02 01 02.

Другие опции

-q, --quiet
Подавляет предупреждения и уведомления. Укажите эту опцию дважды, чтобы подавить и ошибки. Эта опция не влияет на код возврата. То есть, даже если предупреждение было подавлено, код возврата, указывающий на предупреждение, все равно используется.

-v, --verbose
Подробный вывод. Если стандартный вывод подключен к терминалу, xz будет отображать индикатор выполнения. Указание --verbose дважды даст еще более подробный вывод.

Индикатор выполнения показывает следующую информацию:

Процент завершения отображается, если известен размер входного файла. То есть, процент не может быть показан в конвейерах.

Объем сжатых данных, создаваемых (при сжатии) или потребляемых (при распаковке).

Объем несжатых данных, потребляемых (при сжатии) или создаваемых (при распаковке).

Коэффициент сжатия, который рассчитывается путем деления объема сжатых данных, обработанных на данный момент, на объем несжатых данных, обработанных на данный момент.

Скорость сжатия или распаковки. Измеряется как объем несжатых данных, потребляемых (при сжатии) или создаваемых (при распаковке) в секунду. Отображается после того, как прошло несколько секунд с момента начала обработки файла xz.

Отображается прошедшее время в формате М:СС или Ч:ММ:СС.

Оценочное оставшееся время отображается только в том случае, если известен размер входного файла и прошло несколько секунд с момента начала обработки файла xz. Время отображается в менее точном формате, в котором нет двоеточий, например, 2 мин 30 сек.

Когда стандартный поток ошибок не является терминалом, опция --verbose заставит xz выводить имя файла, размер сжатых данных, размер несжатых данных, коэффициент сжатия и, возможно, также скорость и прошедшее время в одну строку в стандартный поток ошибок после сжатия или распаковки файла. Скорость и прошедшее время включаются только в том случае, если операция заняла не менее нескольких секунд. Если операция не была завершена, например, из-за прерывания пользователем, также выводится процент завершения, если известен размер входного файла.

-Q, --no-warn
Не устанавливайте код выхода в 2, даже если обнаружено условие, заслуживающее предупреждения. Эта опция не влияет на уровень детализации, поэтому для того, чтобы не отображать предупреждения и не изменять код выхода, необходимо использовать как --quiet, так и --no-warn.

--robot
Выводите сообщения в формате, удобном для машинной обработки. Это предназначено для упрощения создания интерфейсов, которые хотят использовать xz вместо liblzma, что может быть полезно для различных скриптов. Вывод с включенной этой опцией должен быть стабильным между версиями xz. См. раздел "РЕЖИМ РОБОТА" для получения подробной информации.

--info-memory
Отобразите в удобочитаемом формате, сколько физической памяти (ОЗУ) и сколько процессорных потоков, по мнению xz, имеет система, а также пределы использования памяти для сжатия и распаковки, и успешно завершите работу.

-h, --help
Отобразите сообщение справки, описывающее наиболее часто используемые параметры, и успешно завершите работу.

-H, --long-help
Отобразите сообщение справки, описывающее все функции xz, и успешно завершите работу.

-V, --version
Отобразите номер версии xz и liblzma в удобочитаемом формате. Для получения вывода, удобного для машинной обработки, укажите --robot перед --version.

РЕЖИМ РОБОТА

Режим робота активируется опцией --robot. Это упрощает обработку вывода xz другими программами. В настоящее время --robot поддерживается только вместе с --list, --filters-help, --info-memory и --version. В будущем он будет поддерживаться для сжатия и распаковки.

Режим списка

xz --robot --list использует вывод, разделенный табуляцией. Первая колонка каждой строки содержит строку, указывающую тип информации, найденной в этой строке:


name   Это всегда первая строка при начале перечисления файла. Вторая колонка в строке
содержит имя файла.

file   Эта строка содержит общую информацию о файле .xz. Эта строка всегда печатается
после строки name.

stream Этот тип строки используется только в том случае, если указан параметр --verbose. Количество строк stream
равно количеству потоков в файле .xz.

block Этот тип строки используется только в том случае, если указан параметр --verbose. Количество строк block
равно количеству блоков в файле .xz. Строки block отображаются после всех строк stream; разные типы строк не перемешиваются.

summary

Этот тип строки используется только в том случае, если параметр --verbose указан дважды. Эта строка печатается после всех строк block. Как и строка file, строка summary содержит общую информацию о файле .xz.

totals Эта строка всегда является последней строкой в выходных данных перечисления. В ней отображаются общие значения и
размеры.

Столбцы строк file: ### Количество потоков в файле ### Общее количество блоков в потоках ### Сжатый размер файла ### Распакованный размер файла ### Коэффициент сжатия, например, 0,123. Если коэффициент превышает 9,999, вместо коэффициента отображаются три дефиса (---). ### Список имен проверок целостности, разделенных запятыми. Для известных типов проверок используются следующие строки: None, CRC32, CRC64 и SHA-256. Для неизвестных типов проверок используется строка Unknown-N, где N — идентификатор проверки в виде десятичного числа (одно или два знака). ### Общий размер заполнения потока в файле

Столбцы строк stream: ### Номер потока (первый поток имеет номер 1) ### Количество блоков в потоке ### Сжатый начальный сдвиг ### Распакованный начальный сдвиг ### Сжатый размер (не включает заполнение потока) ### Распакованный размер ### Коэффициент сжатия ### Имя проверки целостности Размер заполнения потока

Столбцы строк block: ### Номер потока, содержащего этот блок ### Номер блока относительно начала потока (первый блок имеет номер 1) ### Номер блока относительно начала файла ### Сжатый начальный сдвиг относительно начала файла ### Распакованный начальный сдвиг относительно начала файла ### Общий сжатый размер блока (включает заголовки) ### Распакованный размер ### Коэффициент сжатия Имя проверки целостности

Если параметр --verbose указан дважды, в строках block добавляются дополнительные столбцы. Они не отображаются при однократном указании параметра --verbose, поскольку для получения этой информации требуется много операций поиска и это может занять много времени: Значение проверки целостности в шестнадцатеричном формате Размер заголовка блока Флаги блока: c указывает, что присутствует сжатый размер, а u указывает, что присутствует распакованный размер. Если флаг не установлен, вместо него отображается дефис (-), чтобы сохранить фиксированную длину строки. В будущем в конец строки могут быть добавлены новые флаги. Размер фактических сжатых данных в блоке (это исключает заголовок блока, заполнение блока и поля проверки) Объем памяти (в байтах), необходимый для распаковки этого блока с использованием данной версии xz Цепочка фильтров. Обратите внимание, что большинство параметров, используемых при сжатии, невозможно узнать, потому что в заголовках .xz хранятся только те параметры, которые необходимы для распаковки.


Столбцы строк сводки: ### Объем памяти (в байтах), необходимый для распаковки этого файла с помощью данной версии xz. Да или нет, указывающее, содержат ли все заголовки блоков как сжатый, так и несжатый размеры. Начиная с xz 5.1.2alpha: ### Минимальная версия xz, необходимая для распаковки файла.

Столбцы строки итогов: ### Количество потоков. ### Количество блоков. ### Сжатый размер. ### Несжатый размер. ### Средняя степень сжатия. ### Список контрольных сумм, присутствующих в файлах, разделенных запятыми. ### Размер заполнения потока. ### Количество файлов. Это сделано для того, чтобы порядок предыдущих столбцов соответствовал порядку в строках файлов.

Если параметр --verbose был указан дважды, в строку итогов добавляются дополнительные столбцы: Максимальный объем памяти (в байтах), необходимый для распаковки файлов с помощью данной версии xz. Да или нет, указывающее, содержат ли все заголовки блоков как сжатый, так и несжатый размеры. Начиная с xz 5.1.2alpha: Минимальная версия xz, необходимая для распаковки файла.

В будущих версиях могут быть добавлены новые типы строк, и новые столбцы могут быть добавлены к существующим типам строк, но существующие столбцы не будут изменены.

Информация о фильтрах

xz --robot --filters-help выводит список поддерживаемых фильтров в следующем формате:

filter:option=<значение>,option=<значение>...

filter Название фильтра.

option Название опции, специфичной для фильтра.

value Числовые значения в диапазоне отображаются как <мин-макс>. Строковые значения отображаются в скобках < > и разделяются символом |.

Каждый фильтр выводится на отдельной строке.

###    Информация об ограничении памяти
xz --robot --info-memory выводит одну строку с несколькими столбцами, разделенными табуляцией:

###          Общий объем физической памяти (RAM) в байтах.

###          Ограничение использования памяти для сжатия в байтах (--memlimit-compress). Специальное значение 0 указывает на настройку по умолчанию, которая для однопоточного режима эквивалентна отсутствию ограничения.

###          Ограничение использования памяти для распаковки в байтах (--memlimit-decompress). Специальное значение 0 указывает на настройку по умолчанию, которая для однопоточного режима эквивалентна отсутствию ограничения.

###          Начиная с xz 5.3.4alpha: использование памяти для многопоточной распаковки в байтах (--memlimit-mt-decompress). Это никогда не равно нулю, потому что, если ограничение не указано явно, используется системно-зависимое значение по умолчанию, показанное в столбце 5. Это также никогда не превышает значение в столбце 3, даже если с помощью --memlimit-mt-decompress было указано большее значение.

С версии xz 5.3.4alpha: системное значение по умолчанию для ограничения использования памяти, которое используется для ограничения количества потоков при сжатии с автоматическим количеством потоков (--threads=0) и без указанного ограничения использования памяти (--memlimit-compress). Это также используется в качестве значения по умолчанию для --memlimit-mt-decompress.

С версии xz 5.3.4alpha: количество доступных процессорных потоков.

В будущем вывод команды xz --robot --info-memory может содержать больше столбцов, но не более одной строки.

Версия

xz --robot --version печатает номер версии xz и liblzma в следующем формате:

XZ_VERSION=XYYYZZZS
LIBLZMA_VERSION=XYYYZZZS

X      Основная версия.

YYY    Второстепенная версия. Четные числа означают стабильную версию. Нечетные числа означают альфа- или бета-версию.

ZZZ    Уровень патча для стабильных версий или просто счетчик для версий разработки.

S      Стабильность. 0 — альфа, 1 — бета, 2 — стабильная. S всегда должен быть 2, когда YYY четный.

XYYYZZZS одинаковы в обеих строках, если xz и liblzma взяты из одного и того же выпуска XZ Utils.

Примеры: 4.999.9beta — это 49990091, а 5.0.0 — 50000002.

СТАТУС ВЫХОДА

0     Всё в порядке.

1     Произошла ошибка.

2     Что-то, что заслуживает предупреждения, но фактических ошибок не произошло.

Сообщения (не предупреждения и не ошибки), напечатанные в стандартном потоке ошибок, не влияют на статус выхода.

ОКРУЖАЮЩАЯ СРЕДА

xz анализирует списки опций, разделенных пробелами, из переменных окружения XZ_DEFAULTS и XZ_OPT, в этом порядке, перед анализом опций из командной строки. Обратите внимание, что из переменных окружения анализируются только опции; все не-опции игнорируются. Анализ выполняется с помощью getopt_long(3), который также используется для аргументов командной строки.

Предупреждение: устанавливая эти переменные окружения, пользователь фактически изменяет программы и скрипты, которые запускают xz. В большинстве случаев безопасно устанавливать ограничения использования памяти, количество потоков и параметры сжатия через переменные окружения. Однако некоторые параметры могут нарушить работу скриптов. Очевидный пример — --help, из-за которого xz отображает текст справки вместо сжатия или распаковки файла. Более тонкие примеры — --quiet и --verbose. Во многих случаях полезно включить индикатор выполнения с помощью --verbose, но в некоторых ситуациях дополнительные сообщения создают проблемы. Уровень детализации также влияет на поведение --list.

XZ_DEFAULTS

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

XZ_OPT Это используется для передачи параметров в xz, когда невозможно установить параметры непосредственно в командной строке xz. Это происходит, когда xz запускается скриптом или инструментом, например, GNU [tar]({filename}../../tar)(1).

XZ_OPT=-2v tar caf foo.tar.xz foo

Скрипты могут использовать XZ_OPT, например, для установки параметров сжатия, специфичных для скрипта. Тем не менее, рекомендуется разрешать пользователям переопределять XZ_OPT, если это разумно. Например, в скриптах sh(1) можно использовать что-то вроде этого:

XZ_OPT=${XZ_OPT-"-7e"}
export XZ_OPT

СОВМЕСТИМОСТЬ С LZMA UTILS

Синтаксис командной строки xz является практически надмножеством синтаксиса lzma, unlzma и lzcat, как он представлен в LZMA Utils 4.32.x. В большинстве случаев можно заменить LZMA Utils на XZ Utils, не нарушая работу существующих скриптов. Однако существуют некоторые несовместимости, которые иногда могут вызывать проблемы.

Уровни предустановки сжатия

Нумерация уровней предустановки сжатия не идентична в xz и LZMA Utils. Наиболее важное различие заключается в том, как размеры словаря сопоставляются с различными предустановками. Размер словаря примерно равен объему памяти, используемой декомпрессором.

Уровень xz LZMA Utils -0 256 KiB N/A -1 1 MiB 64 KiB -2 2 MiB 1 MiB -3 4 MiB 512 KiB -4 4 MiB 1 MiB -5 8 MiB 2 MiB -6 8 MiB 4 MiB -7 16 MiB 8 MiB -8 32 MiB 16 MiB -9 64 MiB 32 MiB

Различия в размерах словаря также влияют на использование памяти компрессором, но есть и другие различия между LZMA Utils и XZ Utils, которые делают это различие еще больше:

Уровень xz LZMA Utils 4.32.x -0 3 MiB N/A -1 9 MiB 2 MiB -2 17 MiB 12 MiB -3 32 MiB 12 MiB -4 48 MiB 16 MiB -5 94 MiB 26 MiB -6 94 MiB 45 MiB -7 186 MiB 83 MiB -8 370 MiB 159 MiB -9 674 MiB 311 MiB

Уровень предустановки по умолчанию в LZMA Utils — -7, а в XZ Utils — -6, поэтому оба используют словарь объемом 8 MiB по умолчанию.

Потоковые и непотоковые .lzma-файлы

Размер несжатого файла может храниться в заголовке .lzma. LZMA Utils делает это при сжатии обычных файлов. Альтернативой является указание того, что размер несжатого файла неизвестен, и использование маркера конца потока, чтобы указать, где декомпрессору следует остановиться. LZMA Utils использует этот метод, когда размер несжатого файла неизвестен, что происходит, например, в каналах.

xz поддерживает декомпрессию .lzma-файлов как с маркером конца потока, так и без него, но все .lzma-файлы, созданные xz, будут использовать маркер конца потока и иметь размер несжатого файла, указанный как неизвестный в заголовке .lzma. Это может быть проблемой в некоторых необычных ситуациях. Например, декомпрессор .lzma во встроенном устройстве может работать только с файлами, для которых известен размер несжатого файла. Если вы столкнулись с этой проблемой, вам необходимо использовать LZMA Utils или LZMA SDK для создания .lzma-файлов с известным размером несжатого файла.


Неподдерживаемые файлы .lzma

Формат .lzma допускает значения lc до 8 и значения lp до 4. LZMA Utils может распаковывать файлы с любыми значениями lc и lp, но всегда создает файлы со значениями lc=3 и lp=0. Создание файлов с другими значениями lc и lp возможно с помощью xz и LZMA SDK.

Реализация фильтра LZMA1 в liblzma требует, чтобы сумма lc и lp не превышала 4. Таким образом, файлы .lzma, которые превышают это ограничение, не могут быть распакованы с помощью xz.

LZMA Utils создает только файлы .lzma, которые имеют размер словаря, равный 2^n (степени 2), но принимает файлы с любым размером словаря. liblzma принимает только файлы .lzma, которые имеют размер словаря, равный 2^n или 2^n + 2^(n-1). Это сделано для уменьшения количества ложных срабатываний при обнаружении файлов .lzma.

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

"Хвост" (Trailing garbage)

При распаковке LZMA Utils тихо игнорирует все данные после первого потока .lzma. В большинстве случаев это ошибка. Это также означает, что LZMA Utils не поддерживает распаковку конкатенированных файлов .lzma.

Если после первого потока .lzma остались данные, xz считает файл поврежденным, если не используется параметр --single-stream. Это может нарушить работу некоторых скриптов, которые предполагали, что "хвост" игнорируется.

ЗАМЕТКИ

Сжатый вывод может отличаться

Точный сжатый вывод, полученный из одного и того же несжатого входного файла, может отличаться между разными версиями XZ Utils, даже если параметры сжатия одинаковы. Это связано с тем, что кодировщик может быть улучшен (ускорен или лучше сжимает), не влияя на формат файла. Вывод может отличаться даже между разными сборками одной и той же версии XZ Utils, если используются разные параметры сборки.

Вышеуказанное означает, что после реализации параметра --rsyncable, полученные файлы не обязательно будут совместимы с rsync, если старые и новые файлы сжимались с использованием разных версий xz. Эту проблему можно решить, если часть реализации кодировщика будет зафиксирована для обеспечения стабильности вывода, совместимого с rsync, между версиями xz.

Встроенные декомпрессоры .xz

Реализации встроенных декомпрессоров .xz, такие как XZ Embedded, не обязательно поддерживают файлы, созданные с использованием типов проверок целостности, отличных от none и crc32. Поскольку по умолчанию используется --check=crc64, необходимо использовать --check=none или --check=crc32 при создании файлов для встраиваемых систем.

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

XZ Embedded поддерживает фильтры BCJ, но только с смещением начала по умолчанию.

ПРИМЕРЫ

Основы

Сжать файл foo в файл foo.xz, используя уровень сжатия по умолчанию (-6), и удалить foo, если сжатие прошло успешно:

xz foo

Распаковать файл bar.xz в файл bar и не удалять bar.xz, даже если распаковка прошла успешно:


xz -dk bar.xz

Создайте файл baz.tar.xz с использованием предустановки -4e (-4 --extreme), который медленнее, чем настройка по умолчанию -6, но требует меньше памяти для сжатия и распаковки (48 МБ и 5 МБ соответственно):

tar cf - baz | xz -4e > baz.tar.xz

Смешанную коллекцию сжатых и несжатых файлов можно распаковать в стандартный вывод с помощью одной команды:

xz -dcf a.txt b.txt.xz c.txt d.txt.lzma > abcd.txt

Параллельное сжатие нескольких файлов

В системах GNU и BSD можно использовать команды find(1) и xargs(1) для параллельного сжатия нескольких файлов:

find . -type f \! -name '*.xz' -print0 \
| xargs -0r -P4 -n16 xz -T1

Опция -P для xargs(1) задает количество параллельных процессов xz. Наилучшее значение для опции -n зависит от количества файлов, которые необходимо сжать. Если файлов всего несколько, значение должно быть, вероятно, 1; при десятках тысяч файлов, 100 или даже больше могут быть подходящими, чтобы уменьшить количество процессов xz, которые в конечном итоге создаст xargs(1).

Опция -T1 для xz предназначена для принудительного перевода ее в однопоточный режим, поскольку xargs(1) используется для управления уровнем параллелизма.

Режим робота

Вычислите, сколько байт было сохранено в общей сложности после сжатия нескольких файлов:

xz --robot --list *.xz | awk '/^totals/{print $5-$4}'

Скрипт может захотеть узнать, использует ли он достаточно новую версию xz. Следующий sh(1) скрипт проверяет, что номер версии утилиты xz не меньше 5.0.0. Этот метод совместим со старыми бета-версиями, которые не поддерживали опцию --robot:

if ! eval "$(xz --robot --version 2> /dev/null)" ||
[ "$XZ_VERSION" -lt 50000002 ]; then
echo "Ваша версия xz слишком старая."
fi
unset XZ_VERSION LIBLZMA_VERSION

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

NEWLIM=$((123 << 20))  # 123 МБ
OLDLIM=$(xz --robot --info-memory | cut -f3)
if [ $OLDLIM -eq 0 -o $OLDLIM -gt $NEWLIM ]; then
XZ_OPT="$XZ_OPT --memlimit-decompress=$NEWLIM"
export XZ_OPT
fi

Пользовательские цепочки фильтров сжатия

Самое простое использование пользовательских цепочек фильтров — это настройка предустановки LZMA2. Это может быть полезно, поскольку предустановки охватывают только подмножество потенциально полезных комбинаций параметров сжатия.

Столбцы CompCPU в таблицах из описаний опций -0 ... -9 и --extreme полезны при настройке предустановок LZMA2. Вот соответствующие части, взятые из этих двух таблиц:

Предустановка CompCPU -0 0 -1 1 -2 2 -3 3 -4 4 -5 5 -6 6 -5e 7 -6e 8

Если вы знаете, что для хорошего сжатия файлу требуется довольно большой словарь (например, 32 МБ), но вы хотите сжать его быстрее, чем это сделает xz -8, предустановку с низким значением CompCPU (например, 1) можно изменить, чтобы использовать больший словарь:

xz --lzma2=preset=1,dict=32MiB foo.tar

Для некоторых файлов приведенная выше команда может работать быстрее, чем xz -6, при этом обеспечивая значительно лучшую степень сжатия. Однако следует подчеркнуть, что только некоторые файлы получают значительную выгоду от использования большого словаря, сохраняя при этом низкое значение CompCPU. Наиболее очевидная ситуация, когда большой словарь может значительно помочь, — это архив, содержащий очень похожие файлы размером не менее нескольких мегабайт. Размер словаря должен быть значительно больше, чем размер любого отдельного файла, чтобы LZMA2 мог в полной мере использовать сходство между последовательными файлами.

Если очень высокое использование памяти компрессором и декомпрессором допустимо, и файл, который сжимается, имеет размер не менее нескольких сотен мегабайт, может быть полезно использовать еще больший словарь, чем 64 МБ, который используется в xz -9:

xz -vv --lzma2=dict=192MiB big_foo.tar

Использование -vv ( --verbose --verbose) в приведенном выше примере может быть полезно для просмотра требований к памяти компрессора и декомпрессора. Помните, что использование словаря, превышающего размер несжатого файла, является нерациональным использованием памяти, поэтому приведенная выше команда не имеет смысла для небольших файлов.

Иногда время сжатия не имеет значения, но необходимо поддерживать низкое использование памяти декомпрессором, например, чтобы можно было распаковать файл на встроенной системе. Следующая команда использует -6e (-6 --extreme) в качестве базового значения и устанавливает размер словаря всего в 64 КБ. Полученный файл можно распаковать с помощью XZ Embedded (поэтому используется --check=crc32), используя около 100 КБ памяти.

xz --check=crc32 --lzma2=preset=6e,dict=64KiB foo

Если вы хотите максимально уменьшить размер файла, настройка количества битов контекста литералов (lc) и количества битов позиции (pb) иногда может помочь. Настройка количества битов позиции литералов (lp) также может помочь, но обычно lc и pb более важны. Например, в архиве с исходным кодом содержится в основном текст US-ASCII, поэтому что-то вроде следующего может дать немного меньший файл (примерно на 0,1%), чем xz -6e (попробуйте также без lc=4):

xz --lzma2=preset=6e,pb=0,lc=4 source_code.tar

Использование другого фильтра вместе с LZMA2 может улучшить сжатие для определенных типов файлов. Например, для сжатия общей библиотеки x86-32 или x86-64 с помощью фильтра x86 BCJ:

xz --x86 --lzma2 libfoo.so

Обратите внимание, что порядок параметров фильтра имеет значение. Если --x86 указан после --lzma2, xz выдаст ошибку, потому что после LZMA2 не может быть никаких фильтров, а также потому, что фильтр x86 BCJ не может использоваться в качестве последнего фильтра в цепочке.

Фильтр Delta вместе с LZMA2 может дать хорошие результаты с растровыми изображениями. Обычно он должен превосходить PNG, в котором есть несколько более продвинутых фильтров, чем простой дельта-фильтр, но для фактического сжатия используется Deflate.

Изображение должно быть сохранено в несжатом формате, например, как несжатый TIFF. Параметр расстояния фильтра Delta устанавливается таким образом, чтобы он соответствовал количеству байтов на пиксель в изображении. Например, для 24-битного RGB-изображения требуется dist=3, и также полезно передавать pb=0 в LZMA2, чтобы обеспечить трехбайтовое выравнивание.


xz --delta=dist=3 --lzma2=pb=0 foo.tiff

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

ССЫЛКИ

xzdec(1), xzdiff(1), xzgrep(1), xzless(1), xzmore(1), gzip(1), bzip2(1), 7z(1)

XZ Utils: [https://tukaani.org/xz/]
XZ Embedded: [https://tukaani.org/xz/embedded.html]
LZMA SDK: [https://7-zip.org/sdk.html]