explainshell, xz, gzip e tar - Compressão de dados no Linux
Tags: linux, xz
Published: 2024-04-26 18:34:31

No inicio desse mês de abril, boa parte da turma de tecnologia soube da notícia do nosso amigo Andres Freud que salvou o mundo ao descobrir código malicioso nas últimas versões do xz utils - [CVE-2024-3094](https://www.kaspersky.com.br/blog/cve-2024-3094-vulnerability-backdoor/22371/).

Aos usuários Linux, em especial novatos, apresento este algoritmo de compressão e como utilizá-lo com `tar`.

Mas antes de soltar tudo que é comando, recomendo entender detalhes dos comandos aqui utilizados acessando o site [explainshell.com](https://explainshell.com/).

## explainshell.com

![explainshell](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b3n2oic0gdk8mh0tf8fj.png)
É um site que analisa comandos Unix e Linux. Ele desmembra cada parte do comando e explica com detalhes o que cada parte faz, fornecendo descrição dos argumentos, opções e operações do comando. É uma excelente ferramenta de consulta para compreender e aprender sobre o funcionamento desses comandos. 

---

## Compressão de dados
Segundo o material do Linux Essentials da LPI, a compressão é usada para reduzir a quantidade de espaço que um conjunto específico de dados consome. Em geral, recorremos a ela para reduzir a quantidade de espaço necessária para armazenar um arquivo. 

---

## xz
xz é um utilitário de compactação de dados de alta taxa de compressão, que geralmente é usado em sistemas Unix e Linux para compactar arquivos e economizar espaço em disco. Ele utiliza o algoritmo LZMA2 para compressão, que é conhecido por sua eficiência em termos de taxa de compressão.

Comparando com o gz o xz tem maior uso de memória.

*Compactando*
```bash
xz meu_arquivo 

# A opção -k mantém o arquivo original intacto
xz -k meu_arquivo
```

*Descompactando*
```bash
xz -d meu_arquivo

# A opção -d mantém o arquivo compactado original
xz -dk meu_arquivo

# ou 
unxz meu_arquivo
```

*Níveis de compressão*

O xz oferece diferentes níveis de compressão, que variam de 0 a 9, sendo 0 o nível de compressão mais rápido, mas com menor taxa de compressão, e 9 o mais lento, mas com a maior taxa de compressão. O nível de compressão padrão é 6.



```bash
xz -9 meu_arquivo 
```

---

## Tar (Tape archive)

O Tar não é um utilitário de compressão por si só, ele apenas agrupa arquivos em um único arquivo, sem comprimi-los. Para compactar arquivos usando tar é necessário combiná-lo com utilitários de compressão como xz e gzip.

Uma boa vantagem em usar o tar é a preservação dos metadados, isto é, preservar as permissões de arquivos e timestamps por exemplo.

Sysadmins usam o tar para criar backups de arquivos e diretórios. Esses backups podem ser usados para restaurar sistemas em caso de falha ou para migrar dados para outro servidor.

Desenvolvedores frequentemente empacotam seus aplicativos e bibliotecas em arquivos tar para distribuição. Isso é comum em projetos de software de código aberto, onde fornecem uma versão compactada do código-fonte para facilitar o download e a instalação.

---

### Criar um arquivo tar com algortimo de compressão [.xz, .gz]
 
> tar com xz: *meu_arquivo.tar.xz*
>
> tar com gz: *meu_arquivo.tar.gz*

O que acontece primeiro é o processo de empacotamento dos arquivos no formato `.tar` e depois a compactação no formato do algoritmo de compressão utilizado. 
A seguir como compactar, descompactar e listar

#### Compactar, Descompactar e Listar

*xz*

```bash
# Compactar
tar -cJvf meus_pdfs.tar.xz meus_pdfs/
# ou compactar usando nível de compressão
tar -cf - *.pdf | xz -7 > meus_pdfs.tar.xz

# Descompactar
tar -xJvf meus_pdfs.tar.xz
# ou 
tar -xJvf meus_pdfs.tar.xz -C diretorio_novo/

# Listar arquivos
tar -tJvf meus_pdfs.tar.xz
```

*gzip*
```bash
# Compactar
tar -czvf meus_pdfs.tar.gz meus_pdfs/

# Descompactar
tar -xvzf meus_pdfs.tar.gz

# Listar arquivos
tar -tvf meus_pdfs.tar.gz
```

Essa postagem pode servir como um guia para uso dos comandos que permitem compressão de dados no Linux, lembre-se de consultar sobre os comandos no manual (`man`) ou no explainshell.