Criei esta estrutura de diretório simples:
$ tree testdir/
testdir/
├── subdir1
│ ├── file1.txt
│ └── file2.txt
├── subdir2
│ ├── file3.txt
│ └── file4.txt
e gostaria de arquivar o conteúdo de testdir em um arquivo tar. Então eu executo o seguinte comando (note que o exclude é por causa desta resposta ):
tar cvf /home/myuser/testdir/testdir_tarfile.tar --exclude=/home/myuser/testdir/testdir_tarfile.tar /home/myuser/testdir
Agora eu quero extrair os arquivos (junto com a estrutura de diretórios deles) mais uma vez. Então, primeiro crie um diretório de destino:
$ mkdir /home/myuser/testdir/target_dir
e agora extraia o arquivo tar para o diretório de destino:
tar xf /home/myuser/testdir/testdir_tarfile.tar -C /home/myuser/testdir/target_dir/
A estrutura do arquivo resultante se parece com isto:
$ tree testdir/
testdir/
├── subdir1
│ ├── file1.txt
│ └── file2.txt
├── subdir2
│ ├── file3.txt
│ └── file4.txt
├── target_dir
│ └── home
│ └── myuser
│ └── testdir
│ ├── subdir1
│ │ ├── file1.txt
│ │ └── file2.txt
│ └── subdir2
│ ├── file3.txt
│ └── file4.txt
└── testdir_tarfile.tar
Por que o diretório de destino agora contém subpastas "home" e "myuser"? Eu gostaria que ele contivesse apenas "subdir1" e "subdir2", ou seja, como o diretório original arquivado.
Você também precisa usar a
-C
opção durante a compressão. Por exemplo:que é basicamente equivalente a:
Como pode ser visto na saída detalhada, observe que isso cria um TAR contendo caminhos relativos:
Se você quiser criar um TAR com caminhos absolutos, ou tiver um TAR desse tipo, e precisar extraí-lo, será necessário extraí-lo removendo o prefixo desta forma: