Linux - Comando tar
O comando tar
(abreviação de "tape archive" ou "arquivo de fita") permite combinar vários arquivos em um único arquivamento de arquivos. Ele possui a seguinte sintaxe:
tar [opções] [nome_do_arquivo] [arquivos ou pastas para arquivamento]
Primeiro, o comando recebe um conjunto de opções. Em seguida, o nome do arquivo no qual os arquivos/pastas devem ser colocados ou do qual devem ser extraídos. O último parâmetro representa o caminho para os arquivos ou diretórios que precisam ser arquivados ou desarquivados.
As opções permitem controlar o comportamento do comando e indicam o que queremos fazer. Como há muitas opções, vou listar as mais usadas:
-c, --create
: cria um arquivo--delete
: exclui o conteúdo do arquivo-d, --diff, --compare
: compara arquivos-r, --append
: adiciona arquivos ao final do arquivo-t, --list
: exibe o conteúdo do arquivo-x, --extract, --get
: extrai arquivos do arquivo-f, --file=ARCHIVE
: usa ARCHIVE como nome do arquivo-v, --verbose
: exibe uma lista detalhada dos arquivos processados--overwrite
: sobrescreve arquivos ao extrair--overwrite-dir
: sobrescreve diretórios ao extrair--remove-files: exclui arquivos ao adicioná-los ao arquivo
Suponha que no diretório inicial do usuário existam os seguintes arquivos:
- hello.txt
- image.png
- index.html
Vamos arquivar esses arquivos em um arquivo chamado "archive.tar":
programicio@Programicio:~$ tar -cvf archive.tar hello.txt image.png index.html hello.txt image.png index.html
Neste caso, o comando tar recebe três opções: -c
(criar arquivo), -v
(exibir detalhes da operação) e -f
(definir o nome do arquivo de arquivo).
É considerado que estamos no diretório inicial e os arquivos a serem arquivados estão neste diretório, e o arquivo de arquivo é criado neste diretório. No entanto, os caminhos podem variar. Para esse caso, podemos passar os caminhos completos dos arquivos. Por exemplo, se os arquivos estiverem na pasta "Documents":
tar -cvf ~/archive.tar ~/Documents/hello.txt ~/Documents/image.png ~/Documents/index.html
Vamos obter informações sobre o arquivo criado:
programicio@Programicio:~$ tar -tvf archive.tar -rw-rw-r-- programicio/programicio 1572 2024-03-09 11:39 hello.txt -rw-rw-r-- programicio/programicio 177489 2024-02-26 09:49 image.png -rw-rw-r-- programicio/programicio 67 2024-02-23 23:07 index.html
Vamos descompactar o arquivo criado:
programicio@Programicio:~$ tar -xvf archive.tar hello.txt image.png index.html
De forma similar, podemos arquivar diretórios: Por exemplo, para arquivar o diretório inicial do usuário em um arquivo /tmp/home.tar
:
tar -cvf /tmp/home.tar /home
É possível até mesmo criar um backup de todo o sistema, arquivando vários diretórios:
tar -cvf /tmp/system-backup.tar /home /srv /root /var
Adicionando Compressão
Vale notar que a criação de um arquivo tar combina vários arquivos ou diretórios em um único pacote, mas não os comprime. Para comprimir arquivos, o comando tar deve receber as opções correspondentes:
-z
: utiliza a ferramentagzip
para compressão-j
: utiliza a ferramentabzip2
para compressão
Por exemplo, vamos arquivar arquivos usando compressão gzip:
tar -czvf archive.tar.gz hello.txt image.png index.html
Isso cria um arquivo archive.tar.gz
. Para descompactá-lo, o processo é o mesmo que para um arquivo sem compressão:
tar -xvf archive.tar.gz
Podemos chamar componentes de criação e compressão de arquivos separadamente, construindo uma cadeia de comandos:
tar -cvf test.tar test | bzip2 -9 -c > test.tar.bz2
Aqui, a execução é dividida em três partes. Primeiro, criamos o arquivo test.tar
a partir da pasta test
:
tar -cvf test.tar test
Depois, comprimimos este arquivo usando a ferramenta bzip2
, aplicando o nível de compressão 9
(máxima compressão) e a opção -c
(compressão):
bzip2 -9 -c
Finalmente, redirecionamos o resultado da ferramenta bzip2
para o arquivo test.tar.bz2
, criando assim um arquivo comprimido.
Gerenciamento de nomes
Ao criar um arquivo tar
, todos os arquivos e diretórios são armazenados com seus caminhos completos. Por exemplo, suponha que no diretório Documents
exista a pasta test
que queremos arquivar:
programicio@Programicio:~$ tar -cvf archive.tar ~/Documents/test tar: Removing leading `/' from member names /home/programicio/Documents/test/ /home/programicio/Documents/test/image.png /home/programicio/Documents/test/index.html /home/programicio/Documents/test/hello.txt /home/programicio/Documents/test/output.txt
Aqui, cada arquivo da pasta test
é salvo no arquivo com o caminho /home/programicio/Documents/test
. Agora, vamos descompactar o arquivo:
programicio@Programicio:~$ tar -xvf archive.tar /home/programicio/Documents/test/ /home/programicio/Documents/test/image.png /home/programicio/Documents/test/index.html /home/programicio/Documents/test/hello.txt /home/programicio/Documents/test/output.txt
Como resultado, será criada uma pasta /home/programicio/Documents/test/
no diretório atual, contendo os arquivos da pasta test
.
Se quisermos descompactar o arquivo na pasta test
ou diretamente na pasta atual, temos duas opções:
- Mudar para o diretório que contém os arquivos a serem arquivados e executar o comando
tar
a partir desse diretório, evitando assim a adição dos caminhos completos aos arquivos. - Usar a opção
-C
ao criar o arquivo, o que permite incluir apenas os nomes relativos dos arquivos e diretórios no arquivo.
Por exemplo, usando a segunda opção:
programicio@Programicio:~$ tar -cvf archive.tar -C ~/Documents/test . ./ ./image.png ./index.html ./hello.txt ./output.txt programicio@Programicio:~$
Após a opção -C
, indicamos o caminho dos arquivos dentro do arquivo tar
. O ponto .
indica que o conteúdo da pasta test
será adicionado ao arquivo sem caminhos completos. Ao descompactar, todos os arquivos serão extraídos na pasta atual:
programicio@Programicio:~$ tar -xvf archive.tar ./ ./image.png ./index.html ./hello.txt ./output.txt
Outro exemplo é arquivar todo o conteúdo da pasta ~/Documents/test
no diretório test
:
programicio@Programicio:~$ tar -cvf archive.tar -C ~/Documents test test/ test/image.png test/index.html test/hello.txt test/output.txt
Ao descompactar, todos os arquivos serão extraídos para a pasta test
no diretório atual:
programicio@Programicio:~$ tar -xvf archive.tar test/ test/image.png test/index.html test/hello.txt test/output.txt
Podemos também ajustar o caminho onde o arquivo será extraído usando a opção -C
:
programicio@Programicio:~$ mkdir test_new programicio@Programicio:~$ tar -xvf archive.tar -C test_new ./ ./image.png ./index.html ./hello.txt ./output.txt
Neste caso, primeiro criamos a pasta test_new
e depois extraímos o arquivo para ela.
Backup Incremental
A opção -g
permite criar um backup incremental. Por exemplo, vamos fazer backup da pasta test
:
mkdir backup tar -czvg backup/snapshot-file -f backup/backup-initial.tar.gz test
Neste caso, os backups são colocados na pasta backup
, que criamos previamente. O segundo comando criará o arquivo snapshot-file
, que contém uma lista de todos os arquivos incluídos no backup. O arquivo backup-initial.tar.gz
será o backup inicial.
Após a criação do backup inicial, podemos fazer alterações na pasta test
, como modificar arquivos existentes ou adicionar novos. Para criar o próximo backup incremental, usamos o mesmo comando com o arquivo de snapshot existente:
Após a criação do backup inicial, podemos fazer alterações na pasta test
, como modificar arquivos existentes ou adicionar novos, ou até criar mais um, o próximo backup incremental:
tar -czvg backup/snapshot-file -f backup/backup-11032024.tar.gz test
Se por algum motivo a pasta test
for excluída acidentalmente e precisarmos restaurá-la, devemos descompactar os backups sequencialmente, começando pelos mais antigos:
tar -xzvf backup/backup-initial.tar.gz tar -xzvf backup/backup-11032024.tar.gz
Assim, conseguimos restaurar todos os arquivos, incluindo as alterações feitas entre os backups.