提取tar存档时删除目录结构

时间:2011-10-28 19:07:03

标签: tar directory-structure

假设我使用tar -czvf subdir.tgz subdirectory/*在服务器A上创建了tar存档。如果我在服务器B上有一个并行结构,我已经复制了这个tarball,我现在想要删除同一个子目录 - 包括删除这个子目录中不存在于tar存档中的任何文件 - 我可以< / em> cd进入服务器B上的父目录,rm -rf subdirectory,然后tar -xzvf subdir.tgz

有没有办法在不必先运行rm

的情况下执行此操作

作为测试,我在subdirectory/dummy/的服务器B中放置了一个虚拟目录,然后运行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

1 个答案:

答案 0 :(得分:1)

--recursive-unlink仅删除文件和目录,如果它阻止您解压缩新文件。为此,请添加--unlink-first。使用这两个选项,新tar中的文件和目录not将被删除。

这就是我的工作方式:

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

也许你有不同的焦油?