Удалить структуру каталогов при распаковке tar-архива

Предположим, я создал tar-архив на сервере A, используя tar -czvf subdir.tgz subdirectory/*. Если у меня есть параллельная структура на сервере B, на который я скопировал этот архив, и я хочу теперь перебрать тот же подкаталог - включая удаление любых файлов в этом подкаталоге, которых нет в tar-архиве, - я мог бы < / em> cd в родительский каталог на сервере B, rm -rf subdirectory, а затем tar -xzvf subdir.tgz.

Есть ли способ сделать это без предварительного запуска rm?

В качестве теста я поместил фиктивный каталог на сервере B на subdirectory/dummy/, а затем запустил tar -xzvf subdir.tgz --recursive-unlink, но, к моему удивлению, subdirectory/dummy/ все еще был там. Думаю, я неправильно понял, что делает --recursive-unlink.

ИЗМЕНИТЬ ========== вот пример. Я создаю два каталога, которые будут представлять два «зеркальных» каталога на двух разных серверах (думайте о них как о сервере «a» и сервере «b»). В каталоге назначения ('b') я создаю дополнительный каталог и некоторые файлы, которых нет в tar-архиве. Я ожидаю, что они будут затерты и удалены. По сути, все, что мне нужно, когда я закончу, в каталоге «b» - это файлы из каталога «a». Но, как видно из примера, несмотря на --unlink-first и --recursive-unlink, лишний каталог и файлы остаются там после распаковки.

-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

person Tom Auger    schedule 28.10.2011    source источник


Ответы (1)


--recursive-unlink удаляет файлы и каталоги только в том случае, если это не позволяет вам распаковать новые файлы. Для ваших целей добавьте --unlink-first. При использовании обоих вариантов файлы и каталоги not в новом tar будут удалены раньше.

У меня это работает так:

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

Может у вас другой гудрон?

person ott--    schedule 28.10.2011
comment
Я создал подкаталог test /, а также коснулся файла test1.txt в основном подкаталоге, а затем использовал --recursive-unlink, а также --unlink-first, и как каталог test /, так и файл test1.txt были ВСЕ ЕЩЕ в этом структура каталогов. Так что я не думаю, что это правильный ответ. - person Tom Auger; 31.10.2011
comment
Мои результаты кажутся другими. tar -xzvf ../b/tar.tgz --unlink-first --recursive-unlink ./ не удалял каталоги или файлы, которых не было в tar. Подробнее см. Мой отредактированный пост. - person Tom Auger; 27.01.2012
comment
Какая у вас версия tar? Какая у вас версия ОС? Мой пример взят из KNOPPIX (на основе Debian). - person ott--; 28.01.2012