假设我使用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
答案 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
也许你有不同的焦油?