XZ(1) | XZ Utils | XZ(1) |
xz, unxz, xzcat, lzma, unlzma, lzcat - Compacta ou descompacta arquivos .xz e .lzma
xz [opção...] [arquivo...]
unxz é equivalente a xz --decompress.
xzcat é equivalente a xz --decompress --stdout.
lzma é equivalente a xz --format=lzma.
unlzma é equivalente a xz --format=lzma --decompress.
lzcat é equivalente a xz --format=lzma --decompress
--stdout.
Ao escrever scripts que precisam descompactar arquivos, é recomendável sempre usar o nome xz com os argumentos apropriados (xz -d ou xz -dc) em vez dos nomes unxz e xzcat.
xz é uma ferramenta de compactação de dados de uso geral com sintaxe de linha de comando semelhante ao gzip(1) e ao bzip2(1). O formato de arquivo nativo é o formato .xz, mas o formato legado .lzma usado por LZMA Utils e fluxos compactados brutos sem cabeçalhos de formato de contêiner também são suportados. Além disso, a descompactação do formato .lz usado por lzip é suportada.
xz compacta ou descompacta cada arquivo de acordo com o modo de operação selecionado. Se nenhum arquivo for fornecido ou arquivo for -, xz lê da entrada padrão e grava os dados processados na saída padrão. xz recusará (exibirá um erro e ignorará o arquivo) para gravar dados compactados na saída padrão se for um terminal. Da mesma forma, xz se recusará a ler dados compactados da entrada padrão se for um terminal.
A menos que --stdout seja especificado, arquivos diferentes de - são gravados em um novo arquivo cujo nome é derivado do nome arquivo de origem:
Se o arquivo de destino já existir, um erro será exibido e arquivo será ignorado.
A menos que grave na saída padrão, xz exibirá um aviso e pulará o arquivo se qualquer um dos seguintes se aplicar:
Depois de compactar ou descompactar com êxito o arquivo, o xz copia o dono, grupo, permissões, horário de acesso e horário de modificação do arquivo de origem para o arquivo de destino. Se a cópia do grupo falhar, as permissões serão modificadas para que o arquivo de destino não se torne acessível a usuários que não têm permissão para acessar o arquivo de origem. xz ainda não oferece suporte à cópia de outros metadados, como listas de controle de acesso ou atributos estendidos.
Depois que o arquivo de destino for fechado com êxito, o arquivo de origem será removido, a menos que --keep tenha sido especificado. O arquivo de origem nunca é removido se a saída for gravada na saída padrão ou se ocorrer um erro.
O envio de SIGINFO ou SIGUSR1 para o processo do xz faz com que ele imprima informações de andamento para erro padrão. Isso tem uso limitado, pois quando o erro padrão é um terminal, usar --verbose exibirá um indicador de progresso de atualização automática.
O uso de memória de xz varia de algumas centenas de kilobytes a vários gigabytes, dependendo das configurações de compactação. As configurações usadas ao compactar um arquivo determinam os requisitos de memória do descompactador. Normalmente, o descompactador precisa de 5 % a 20 % da quantidade de memória que o compactador precisou ao criar o arquivo. Por exemplo, descompactar um arquivo criado com xz -9 atualmente requer 65 MiB de memória. Ainda assim, é possível ter arquivos .xz que requerem vários gigabytes de memória para descompactar.
Especialmente os usuários de sistemas mais antigos podem achar irritante a possibilidade de uso de memória muito grande. Para evitar surpresas desconfortáveis, o xz possui um limitador de uso de memória embutido, que está desabilitado por padrão. Embora alguns sistemas operacionais forneçam maneiras de limitar o uso de memória dos processos, confiar nele não foi considerado flexível o suficiente (por exemplo, usar ulimit(1) para limitar a memória virtual tende a prejudicar mmap(2)).
O limitador de uso de memória pode ser ativado com a opção de linha de comando --memlimit=limite. Geralmente é mais conveniente habilitar o limitador por padrão definindo a variável de ambiente XZ_DEFAULTS, por exemplo, XZ_DEFAULTS=--memlimit=150MiB. É possível definir os limites separadamente para compactação e descompactação usando --memlimit-compress=limite e --memlimit-decompress=limite. Usar essas duas opções fora de XZ_DEFAULTS raramente é útil porque uma única execução de xz não pode fazer compactação e descompactação e --memlimit=limite (ou -M limite ) é mais curto para digitar na linha de comando.
Se o limite de uso de memória especificado for excedido durante a descompactação, xz exibirá um erro e a descompactação do arquivo falhará. Se o limite for excedido durante a compactação, xz tentará reduzir as configurações para que o limite não seja mais excedido (exceto ao usar --format=raw ou --no-adjust). Dessa forma, a operação não falhará, a menos que o limite seja muito pequeno. A escala das configurações é feita em etapas que não correspondem às predefinições do nível de compactação, por exemplo, se o limite for apenas um pouco menor que o valor necessário para xz -9, as configurações serão reduzidas apenas um pouco , não até xz -8.
É possível concatenar arquivos .xz como estão. xz irá descompactar tais arquivos como se fossem um único arquivo .xz.
É possível inserir preenchimento entre as partes concatenadas ou após a última parte. O preenchimento deve consistir em bytes nulos e o tamanho do preenchimento deve ser um múltiplo de quatro bytes. Isso pode ser útil, por exemplo, se o arquivo .xz for armazenado em uma mídia que mede tamanhos de arquivo em blocos de 512 bytes.
Concatenação e preenchimento não são permitidos com arquivos .lzma ou fluxos brutos.
Na maioria dos lugares onde um argumento inteiro é esperado, um sufixo opcional é suportado para indicar facilmente números inteiros grandes. Não deve haver espaço entre o número inteiro e o sufixo.
O valor especial max pode ser usado para indicar o valor inteiro máximo suportado pela opção.
Se várias opções de modo de operação forem dadas, a última entrará em vigor.
Predefinição | DicTam | 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 |
Predefinição | DicTam | CompCPU | CompMem | DecMem |
-0e | 256 KiB | 8 | 4 MiB | 1 MiB |
-1e | 1 MiB | 8 | 13 MiB | 2 MiB |
-2e | 2 MiB | 8 | 25 MiB | 3 MiB |
-3e | 4 MiB | 7 | 48 MiB | 5 MiB |
-4e | 4 MiB | 8 | 48 MiB | 5 MiB |
-5e | 8 MiB | 7 | 94 MiB | 9 MiB |
-6e | 8 MiB | 8 | 94 MiB | 9 MiB |
-7e | 16 MiB | 8 | 186 MiB | 17 MiB |
-8e | 32 MiB | 8 | 370 MiB | 33 MiB |
-9e | 64 MiB | 8 | 674 MiB | 65 MiB |
Uma cadeia de filtro personalizada permite especificar as configurações de compactação em detalhes, em vez de confiar nas configurações associadas às predefinições. Quando uma cadeia de filtro personalizada é especificada, as opções predefinidas (-0 ... -9 e --extreme) anteriores na linha de comando são esquecidas. Se uma opção predefinida for especificada após uma ou mais opções de cadeia de filtros personalizados, a nova predefinição entrará em vigor e as opções de cadeia de filtros personalizados especificadas anteriormente serão esquecidas.
Uma cadeia de filtro é comparável à tubulação na linha de comando. Ao compactar, a entrada descompactada vai para o primeiro filtro, cuja saída vai para o próximo filtro (se houver). A saída do último filtro é gravada no arquivo compactado. O número máximo de filtros na cadeia é quatro, mas normalmente uma cadeia de filtros tem apenas um ou dois filtros.
Muitos filtros têm limitações sobre onde podem estar na cadeia de filtros: alguns filtros podem funcionar apenas como o último filtro na cadeia, alguns apenas como filtro não-último e alguns funcionam em qualquer posição na cadeia. Dependendo do filtro, essa limitação é inerente ao projeto do filtro ou existe para evitar problemas de segurança.
Uma cadeia de filtro personalizada é especificada usando uma ou mais opções de filtro na ordem desejada na cadeia de filtro. Ou seja, a ordem das opções de filtro é significativa! Ao decodificar fluxos brutos (--format=raw), a cadeia de filtros é especificada na mesma ordem em que foi especificada durante a compactação.
Os filtros usam opções específicas do filtro como uma lista separada por vírgulas. As vírgulas extras em opções são ignoradas. Cada opção tem um valor padrão, portanto, você precisa especificar apenas aquelas que deseja alterar.
Para ver toda a cadeia de filtros e opções, use xz -vv (isto é, use --verbose duas vezes). Isso também funciona para visualizar as opções da cadeia de filtros usadas pelas predefinições.
Filtro | Alinhamento | Observações |
x86 | 1 | x86 32 bits ou 64 bits |
ARM | 4 | |
ARM-Thumb | 2 | |
ARM64 | 4 | Alinhamento de 4096 bytes |
é melhor | ||
PowerPC | 4 | Somente big endian |
IA-64 | 16 | Itanium |
SPARC | 4 |
O modo robô é ativado com a opção --robot. Isso torna a saída de xz mais fácil de ser analisada por outros programas. Atualmente --robot é suportado apenas junto com --version, --info-memory e --list. Ele terá suporte para compactação e descompactação no futuro.
xz --robot --version imprimirá o número da versão de xz e liblzma no seguinte formato:
XZ_VERSION=XYYYZZZS
LIBLZMA_VERSION=XYYYZZZS
XYYYZZZS são iguais em ambas as linhas se xz e liblzma forem da mesma versão do XZ Utils.
Exemplos: 4.999.9beta é 49990091 e 5.0.0 é 50000002.
xz --robot --info-memory imprime uma única linha com três colunas separadas por tabulações:
No futuro, a saída de xz --robot --info-memory pode ter mais colunas, mas nunca mais do que uma única linha.
xz --robot --list usa saída separada por tabulações. A primeira coluna de cada linha possui uma string que indica o tipo de informação encontrada naquela linha:
As colunas das linhas file:
As colunas das linhas stream:
As colunas das linhas block:
Se --verbose for especificado duas vezes, colunas adicionais serão incluídas nas linhas block. Eles não são exibidos com um único --verbose, porque obter essas informações requer muitas buscas e, portanto, pode ser lento:
As colunas das linhas summary:
Desde xz 5.1.2alpha:
As colunas da linha totals:
Se --verbose for especificado duas vezes, colunas adicionais serão incluídas na linha totals:
Desde xz 5.1.2alpha:
Versões futuras podem adicionar novos tipos de linha e novas colunas podem ser adicionadas aos tipos de linha existentes, mas as colunas existentes não serão alteradas.
Observações (não avisos ou erros) impressas no erro padrão não afetam o status de saída.
xz analisa listas de opções separadas por espaços das variáveis de ambiente XZ_DEFAULTS e XZ_OPT, nesta ordem, antes de analisar as opções da linha de comando. Observe que apenas as opções são analisadas a partir das variáveis de ambiente; todas as não opções são silenciosamente ignoradas. A análise é feita com getopt_long(3) que também é usado para os argumentos da linha de comando.
XZ_OPT=-2v tar caf foo.tar.xz foo
XZ_OPT=${XZ_OPT-"-7e"} export XZ_OPT
A sintaxe da linha de comando do xz é praticamente um superconjunto de lzma, unlzma e lzcat conforme encontrado no LZMA Utils 4.32.x. Na maioria dos casos, é possível substituir LZMA Utils por XZ Utils sem interromper os scripts existentes. Existem algumas incompatibilidades, porém, que às vezes podem causar problemas.
A numeração das predefinições de nível de compactação não é idêntica em xz e LZMA Utils. A diferença mais importante é como os tamanhos dos dicionários são mapeados para diferentes predefinições. O tamanho do dicionário é aproximadamente igual ao uso de memória do descompactador.
Nível | xz | LZMA Utils |
-0 | 256 KiB | N/D |
-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 |
As diferenças de tamanho do dicionário também afetam o uso da memória do compressor, mas existem algumas outras diferenças entre LZMA Utils e XZ Utils, que tornam a diferença ainda maior:
Nível | xz | LZMA Utils 4.32.x |
-0 | 3 MiB | N/D |
-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 |
O nível de predefinição padrão no LZMA Utils é -7 enquanto no XZ Utils é -6, então ambos usam um dicionário de 8 MiB por padrão.
O tamanho descompactado do arquivo pode ser armazenado no cabeçalho de .lzma. O LZMA Utils faz isso ao compactar arquivos comuns. A alternativa é marcar que o tamanho não compactado é desconhecido e usar o marcador de fim de carga útil para indicar onde o descompactador deve parar. O LZMA Utils usa este método quando o tamanho não compactado não é conhecido, como é o caso, por exemplo, de encadeamentos (pipes).
xz oferece suporte à descompactação de arquivos .lzma com ou sem marcador de fim de carga útil, mas todos os arquivos .lzma criados por xz usarão marcador de fim de carga útil e terão o tamanho descompactado marcado como desconhecido no cabeçalho de .lzma. Isso pode ser um problema em algumas situações incomuns. Por exemplo, um descompactador de .lzma em um dispositivo embarcado pode funcionar apenas com arquivos que tenham tamanho descompactado conhecido. Se você encontrar esse problema, precisará usar o LZMA Utils ou o LZMA SDK para criar arquivos .lzma com tamanho descompactado conhecido.
O formato .lzma permite valores lc até 8 e valores lp até 4. LZMA Utils pode descompactar arquivos com qualquer lc e lp, mas sempre cria arquivos com lc=3 e lp=0. Criar arquivos com outros lc e lp é possível com xz e com LZMA SDK.
A implementação do filtro LZMA1 em liblzma requer que a soma de lc e lp não exceda 4. Assim, arquivos .lzma, que excedam esta limitação, não podem ser descompactados com xz.
LZMA Utils cria apenas arquivos .lzma que possuem um tamanho de dicionário de 2^n (uma potência de 2), mas aceita arquivos com qualquer tamanho de dicionário. liblzma aceita apenas arquivos .lzma que tenham um tamanho de dicionário de 2^n ou 2^n + 2^(n-1). Isso é para diminuir os falsos positivos ao detectar arquivos .lzma.
Essas limitações não devem ser um problema na prática, já que praticamente todos os arquivos .lzma foram compactados com configurações que o liblzma aceitará.
Ao descompactar, o LZMA Utils silenciosamente ignora tudo após o primeiro fluxo .lzma. Na maioria das situações, isso é um bug. Isso também significa que o LZMA Utils não oferece suporte a descompactação de arquivos .lzma concatenados.
Se houver dados restantes após o primeiro fluxo de .lzma, xz considera o arquivo corrompido, a menos que --single-stream tenha sido usado. Isso pode quebrar scripts obscuros que presumiram que o lixo à direita é ignorado.
A saída compactada exata produzida a partir do mesmo arquivo de entrada não compactado pode variar entre as versões do XZ Utils, mesmo se as opções de compactação forem idênticas. Isso ocorre porque o codificador pode ser aprimorado (compactação mais rápida ou melhor) sem afetar o formato do arquivo. A saída pode variar mesmo entre diferentes compilações da mesma versão do XZ Utils, se diferentes opções de compilação forem usadas.
A informação acima significa que, uma vez que --rsyncable tenha sido implementado, os arquivos resultantes não serão necessariamente "rsyncáveis", a menos que os arquivos antigos e novos tenham sido compactados com a mesma versão xz. Esse problema pode ser corrigido se uma parte da implementação do codificador for congelada para manter a saída de rsyncable estável nas versões do xz.
As implementações do descompactador .xz embarcados, como o XZ Embedded, não oferecem necessariamente suporte a arquivos criados com tipos de verificações de integridade diferentes de none e crc32. Como o padrão é --check=crc64, você deve usar --check=none ou --check=crc32 ao criar arquivos para sistemas embarcados.
Fora dos sistemas embarcados, todos os descompactadores de formato .xz oferecem suporte a todos os tipos de verificação ou, pelo menos, são capazes de descompactar o arquivo sem verificar a verificação de integridade se a verificação específica não for suportada.
XZ Embedded oferece suporte a filtros BCJ, mas apenas com o deslocamento inicial padrão.
Compactar o arquivo foo em foo.xz usando o nível de compactação padrão (-6) e remover foo se a compactação for bem-sucedida:
xz foo
Descompactar bar.xz em bar e não remover bar.xz mesmo se a descompactação for bem-sucedida:
xz -dk bar.xz
Criar baz.tar.xz com a predefinição -4e (-4 --extreme), que é mais lenta que o padrão -6, mas precisa de menos memória para compactação e descompactação (48 MiB e 5 MiB, respectivamente):
tar cf - baz | xz -4e > baz.tar.xz
Uma mistura de arquivos compactados e descompactados pode ser descompactada para a saída padrão com um único comando:
xz -dcf a.txt b.txt.xz c.txt d.txt.lzma > abcd.txt
No GNU e *BSD, find(1) e xargs(1) podem ser usados para paralelizar a compactação de muitos arquivos:
find . -type f \! -name '*.xz' -print0 \ | xargs -0r -P4 -n16 xz -T1
A opção -P para xargs(1) define o número de processos paralelos do xz. O melhor valor para a opção -n depende de quantos arquivos devem ser compactados. Se houver apenas alguns arquivos, o valor provavelmente deve ser 1; com dezenas de milhares de arquivos, 100 ou até mais podem ser apropriados para reduzir o número de processos de xz que xargs(1) eventualmente criará.
A opção -T1 para xz existe para forçá-lo ao modo de thread única, porque xargs(1) é usado para controlar a quantidade de paralelização.
Calcular quantos bytes foram salvos no total depois de compactar vários arquivos:
xz --robot --list *.xz | awk '/^totals/{print $5-$4}'
Um script pode querer saber que está usando xz novo o suficiente. O seguinte script sh(1) verifica se o número da versão da ferramenta xz é pelo menos 5.0.0. Este método é compatível com versões beta antigas, que não suportavam a opção --robot:
if ! eval "$(xz --robot --version 2> /dev/null)" || [ "$XZ_VERSION" -lt 50000002 ]; then echo "Your xz is too old." fi unset XZ_VERSION LIBLZMA_VERSION
Definir um limite de uso de memória para descompactação usando XZ_OPT, mas se um limite já tiver sido definido, não o aumentar:
NEWLIM=$((123 << 20)) # 123 MiB 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
O uso mais simples para cadeias de filtro personalizadas é personalizar uma predefinição LZMA2. Isso pode ser útil, porque as predefinições abrangem apenas um subconjunto das combinações potencialmente úteis de configurações de compactação.
As colunas CompCPU das tabelas das descrições das opções -0 ... -9 e --extreme são úteis ao personalizar as predefinições LZMA2. Aqui estão as partes relevantes coletadas dessas duas tabelas:
Predefinição | CompCPU |
-0 | 0 |
-1 | 1 |
-2 | 2 |
-3 | 3 |
-4 | 4 |
-5 | 5 |
-6 | 6 |
-5e | 7 |
-6e | 8 |
Se você sabe que um arquivo requer um dicionário um tanto grande (por exemplo, 32 MiB) para compactar bem, mas deseja comprimi-lo mais rapidamente do que xz -8 faria, uma predefinição com um valor CompCPU baixo (por exemplo, 1) pode ser modificado para usar um dicionário maior:
xz --lzma2=preset=1,dict=32MiB foo.tar
Com certos arquivos, o comando acima pode ser mais rápido que xz -6 enquanto compacta significativamente melhor. No entanto, deve-se enfatizar que apenas alguns arquivos se beneficiam de um grande dicionário, mantendo o valor CompCPU baixo. A situação mais óbvia, onde um grande dicionário pode ajudar muito, é um arquivo contendo arquivos muito semelhantes de pelo menos alguns megabytes cada. O tamanho do dicionário deve ser significativamente maior do que qualquer arquivo individual para permitir que o LZMA2 aproveite ao máximo as semelhanças entre arquivos consecutivos.
Se o uso muito alto de memória do compactador e do descompactador for bom e o arquivo que está sendo compactado tiver pelo menos várias centenas de megabytes, pode ser útil usar um dicionário ainda maior do que os 64 MiB que o xz -9 usaria:
xz -vv --lzma2=dict=192MiB big_foo.tar
Usar -vv (--verbose --verbose) como no exemplo acima pode ser útil para ver os requisitos de memória do compactador e do descompactador. Lembre-se que usar um dicionário maior que o tamanho do arquivo descompactado é desperdício de memória, então o comando acima não é útil para arquivos pequenos.
Às vezes, o tempo de compactação não importa, mas o uso de memória do descompactador deve ser mantido baixo, por exemplo, para possibilitar a descompactação do arquivo em um sistema embarcado. O comando a seguir usa -6e (-6 --extreme) como base e define o dicionário como apenas 64 KiB. O arquivo resultante pode ser descompactado com XZ Embedded (é por isso que existe --check=crc32) usando cerca de 100 KiB de memória.
xz --check=crc32 --lzma2=preset=6e,dict=64KiB foo
Se você deseja espremer o máximo de bytes possível, ajustar o número de bits de contexto literal (lc) e o número de bits de posição (pb) às vezes pode ajudar. Ajustar o número de bits de posição literal (lp) também pode ajudar, mas geralmente lc e pb são mais importantes. Por exemplo, um arquivo de código-fonte contém principalmente texto US-ASCII, então algo como o seguinte pode fornecer um arquivo ligeiramente (como 0,1 %) menor que xz -6e (tente também sem lc=4):
xz --lzma2=preset=6e,pb=0,lc=4 source_code.tar
O uso de outro filtro junto com o LZMA2 pode melhorar a compactação com determinados tipos de arquivo. Por exemplo, para compactar uma biblioteca compartilhada x86-32 ou x86-64 usando o filtro x86 BCJ:
xz --x86 --lzma2 libfoo.so
Observe que a ordem das opções de filtro é significativa. Se --x86 for especificado após --lzma2, xz dará um erro, porque não pode haver nenhum filtro após LZMA2 e também porque o filtro x86 BCJ não pode ser usado como o último filtro em a corrente.
O filtro Delta junto com LZMA2 pode dar bons resultados com imagens bitmap. Ele geralmente deve superar o PNG, que possui alguns filtros mais avançados do que o delta simples, mas usa Deflate para a compactação real.
A imagem deve ser salva em formato não compactado, por exemplo, como TIFF não compactado. O parâmetro de distância do filtro Delta é definido para corresponder ao número de bytes por pixel na imagem. Por exemplo, bitmap RGB de 24 bits precisa de dist=3, e também é bom passar pb=0 para LZMA2 para acomodar o alinhamento de três bytes:
xz --delta=dist=3 --lzma2=pb=0 foo.tiff
Se várias imagens foram colocadas em um único arquivo (por exemplo, .tar), o filtro Delta também funcionará, desde que todas as imagens tenham o mesmo número de bytes por pixel.
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: <http://7-zip.org/sdk.html>
2022-12-01 | Tukaani |