/ / Remover estrutura de diretório ao extrair arquivo tar - tar, estrutura de diretório

Remova a estrutura de diretórios ao extrair tar archive - tar, estrutura de diretórios

Suponha que eu criei um arquivo tar no Servidor A usando tar -czvf subdir.tgz subdirectory/*. Se eu tiver uma estrutura paralela no servidor B paraque copiei esse tarball e agora quero passar pelo mesmo subdiretório - incluindo remover todos os arquivos desse subdiretório que não estão presentes no arquivo tar - eu poderia cd no diretório pai no servidor B, rm -rf subdirectory e depois tar -xzvf subdir.tgz.

Existe uma maneira de fazer isso sem precisar primeiro executar o rm?

Como teste, coloquei um diretório fictício no Servidor B em subdirectory/dummy/ e depois correu tar -xzvf subdir.tgz --recursive-unlink mas para minha surpresa, subdirectory/dummy/ ainda estava lá. Eu acho que não entendi o que --recursive-unlink faz.

EDIT ========== aqui está um exemplo. Crio dois diretórios, que representariam os dois diretórios "espelhados" em dois servidores diferentes (pense neles como servidor "a" e servidor "b"). No diretório de destino ("b"), crio um diretório extra e alguns arquivos que não estarão presentes no arquivo tar. Espero que sejam removidos e eliminados. Essencialmente, tudo o que desejo no diretório "b" quando terminar é os arquivos do diretório "a". Mas, como pode ser visto no exemplo, apesar de --unlink-first e --recursive-unlink o diretório e os arquivos supérfluos ainda estão lá após descompactar.

-bash-3.2$ mkdir tartest
-bash-3.2$ cd tartest
-bash-3.2$ mkdir a
-bash-3.2$ mkdir b
-bash-3.2$ cd a
-bash-3.2$ mkdir xyz
-bash-3.2$ cd xyz
-bash-3.2$ touch test.1
-bash-3.2$ touch test.2
-bash-3.2$ cd ../
-bash-3.2$ touch test.3
-bash-3.2$ cd ../b
-bash-3.2$ mkdir abc
-bash-3.2$ cd abc
-bash-3.2$ touch test.4
-bash-3.2$ cd ../../a
-bash-3.2$ tar cvf ../archive.tar ./*
./test.3
./xyz/
./xyz/test.2
./xyz/test.1
-bash-3.2$ cd ../b
-bash-3.2$ tar -xf ../archive.tar --unlink-first --recursive-unlink
-bash-3.2$ ls
total 16K
drwxr-xr-x 4 iponly168797 iponly168797 4.0K Jan 27 13:58 .
drwxr-xr-x 4 iponly168797 iponly168797 4.0K Jan 27 13:57 ..
drwxr-xr-x 2 iponly168797 iponly168797 4.0K Jan 27 13:56 abc
-rw-r--r-- 1 iponly168797 iponly168797    0 Jan 27 13:56 test.3
drwxr-xr-x 2 iponly168797 iponly168797 4.0K Jan 27 13:56 xyz
-bash-3.2$ ls xyz
total 8.0K
drwxr-xr-x 2 iponly168797 iponly168797 4.0K Jan 27 13:56 .
drwxr-xr-x 4 iponly168797 iponly168797 4.0K Jan 27 13:58 ..
-rw-r--r-- 1 iponly168797 iponly168797    0 Jan 27 13:56 test.1
-rw-r--r-- 1 iponly168797 iponly168797    0 Jan 27 13:56 test.2

Respostas:

1 para resposta № 1

--recursive-unlink remove apenas arquivos e diretórios, se você não extrair os novos arquivos. Para seu propósito, adicione --unlink-first. Com as duas opções, os arquivos e diretórios not no novo alcatrão será removido antes.

É assim que funciona para mim:

ott@hv:~/tmp/tar $ tar cvf a.tar a
a/
a/test.txt
a/b/
a/c/
a/a/
ott@hv:~/tmp/tar $ cd b
ott@hv:~/tmp/tar/b $ tar xvf ../a.tar
a/
a/test.txt
a/b/
a/c/
a/a/
ott@hv:~/tmp/tar/b $ cd ../a
ott@hv:~/tmp/tar/a $ rmdir b
ott@hv:~/tmp/tar/a $ rm test.txt
rm: reguläre leere Datei »test.txt« entfernen? y
ott@hv:~/tmp/tar/a $ cd ..
ott@hv:~/tmp/tar $ tar cvf a.tar a
a/
a/c/
a/a/
ott@hv:~/tmp/tar $ cd b
ott@hv:~/tmp/tar/b $ tar xvf ../a.tar --unlink-first --recursive-unlink
a/
a/c/
a/a/
ott@hv:~/tmp/tar/b $ ls -lR
.:
insgesamt 8
drwxr-xr-x 4 ott ott 4096 31. Okt 19:21 a

./a:
insgesamt 16
drwxr-xr-x 2 ott ott 4096 28. Okt 21:31 a
drwxr-xr-x 2 ott ott 4096 28. Okt 21:31 c

./a/a:
insgesamt 0

./a/c:
insgesamt 0
ott@hv:~/tmp/tar/b $ tar --version
tar (GNU tar) 1.20

Talvez você tenha um alcatrão diferente?