1001Ferramentas
📦Geradores

Gerador de comando tar

Monte comandos tar (criar, extrair, listar) com compressão (gz/bz2/xz/zst), preservar permissões e exclusões.


  

tar em profundidade: modos, filtros de compressão e backups reproduzíveis

O comando tar — abreviação de tape archive — foi escrito por Jean-loup Gailly em 1979 para o Unix v7, originalmente para serializar sistemas de arquivos em fitas magnéticas. Quase meio século depois, ele segue como formato de empacotamento de fato de toda distribuição Linux, a camada que entrega cada imagem Docker, o formato em que o kernel Linux é distribuído e a base de praticamente todo backup noturno. Sobreviveu por causa do projeto: tar não comprime, apenas empacota. A compressão é colocada em cima por filtros intercambiáveis (gzip, bzip2, xz, zstd), e esse desacoplamento permite trocar o algoritmo sem mudar o formato.

Modos de operação e flags obrigatórias

Toda chamada do tar precisa de um modo e de um arquivo:

  • -c — cria um novo arquivo.
  • -x — extrai de um arquivo existente.
  • -t — lista (table of contents) sem extrair.
  • -r — anexa arquivos a um tar não comprimido.
  • -u — anexa apenas arquivos mais novos do que a entrada correspondente.
  • -f <arq> — caminho do arquivo. Sempre obrigatório, mesmo em pipe (use - para stdin/stdout).

Filtros de compressão: gzip, bzip2, xz, zstd

Filtros são flags curtas que canalizam o tar por um compressor:

-z   gzip   (.tar.gz / .tgz)   rápido, compressão modesta
-j   bzip2  (.tar.bz2)         mais lento, melhor que gzip
-J   xz     (.tar.xz)          lento, ~30% menor que gzip
--zstd      (.tar.zst)         ponto ótimo moderno: ~xz, 5-10x mais rápido
--lz4       (.tar.lz4)         muito rápido, baixa compressão (HPC scratch)
--lzma      (.tar.lzma)        antecessor legado do xz

Em uma árvore de código-fonte de 1 GB, espere aproximadamente: gzip ~300 MB / 4 s, bzip2 ~230 MB / 25 s, xz ~180 MB / 90 s, zstd -19 ~185 MB / 12 s. O zstd é o padrão moderno tanto para backups quanto para camadas de containers.

Modificadores frequentes

  • -v — verbose, imprime cada entrada na stderr.
  • -C <dir> — muda de diretório antes do próximo argumento.
  • --exclude=<glob> — ignora caminhos que casam (repetível, ou via --exclude-from=arquivo).
  • --strip-components=N — descarta N componentes iniciais do caminho ao extrair.
  • -p / --preserve-permissions — mantém modos UNIX; padrão só quando rodando como root.
  • --owner=0 --group=0 --numeric-owner — força UID/GID para gerar archives reproduzíveis.
  • --mtime='@0' + --sort=name — saída bit-a-bit reproduzível (junto com os flags anteriores).
  • -S — trata arquivos esparsos com eficiência (útil para imagens de VM).

Exemplos comentados

# Cria backup com gzip
tar -czvf backup.tar.gz pasta/

# Extrai em qualquer lugar
tar -xzvf backup.tar.gz

# Cria excluindo diretórios pesados
tar --exclude='node_modules' --exclude='.git' \
    -czf src.tgz src/

# Confere o conteúdo sem extrair
tar -tzvf backup.tar.gz | head

# Extrai removendo o diretório raiz
tar -xJf big.tar.xz --strip-components=1 -C /tmp

# Archive reproduzível (idêntico byte a byte entre runs)
tar --sort=name --owner=0 --group=0 --numeric-owner \
    --mtime='@0' -cf src.tar src/

# Envia via SSH sem arquivo temporário
tar -czf - data/ | ssh host 'tar -xzf - -C /backup'

Pegadinhas: GNU vs BSD tar, caminhos e segurança

GNU vs BSD tar. O macOS vem com BSD tar (libarchive), que não tem algumas opções longas do GNU e usa -s para substituição no lugar de --transform. Scripts que precisam rodar nos dois devem se ater a flags curtas e evitar extensões só do GNU como --anchored.

Caminhos absolutos. O tar moderno remove a barra inicial por padrão; só use --absolute-names se souber o que está fazendo — um archive com caminhos absolutos pode sobrescrever arquivos do sistema na extração.

Path traversal. Tar antigo e código ingênuo de tarfile em Python eram vulneráveis a entradas tipo ../../etc/passwd. O tar moderno rejeita por padrão; se você escreve seu próprio extrator, valide cada entrada antes de gravar.

Windows. O Windows 11 24H2 traz tar nativo; versões antigas precisam de 7-Zip, WSL ou Git Bash. .tar.gz sobrevive ao round-trip, mas cuidado com permissões UNIX e symlinks — o NTFS suporta os dois apenas parcialmente.

FAQ

É seguro compartilhar .tar.gz? O formato é seguro; o que importa é a confiança no produtor. Verifique com assinatura destacada (gpg --verify) ou um checksum publicado em um canal diferente.

Consigo abrir .tar.gz no Windows? Sim — 7-Zip, WinRAR, o tar nativo do Windows 11 ou o WSL resolvem. A dupla extração (.tar dentro do .gz) era uma chatice do 7-Zip antigo; versões modernas desembrulham os dois em um clique.

Qual o melhor compressor para backups grandes? zstd --long=27 -19 — aproximadamente o mesmo tamanho final do xz em árvores grandes, mas 5-10x mais rápido para comprimir e 3-5x mais rápido para descomprimir.

Como adiciono um arquivo a um .tar.gz? Não dá — archives comprimidos com gzip não permitem seek. Ou recrie o archive, ou use .tar puro com -r e recompacte no final.

Por que o segundo tar saiu com tamanho diferente, mesmo sem mudanças? A ordem de inodes e os timestamps de metadados variam entre execuções. Para builds reproduzíveis use --sort=name --mtime='@0' --owner=0 --group=0 --numeric-owner.

Ferramentas Relacionadas