gpt4 book ai didi

tar - 解压 tar 存档时删除目录结构

转载 作者:行者123 更新时间:2023-12-04 21:22:50 25 4
gpt4 key购买 nike

假设我在服务器 A 上使用 tar -czvf subdir.tgz subdirectory/* 创建了一个 tar 存档。 .如果我在服务器 B 上有一个并行结构,我已将此 tarball 复制到该结构,并且我现在想在同一个子目录上进行破坏 - 包括删除此子目录中不存在于 tar 存档中的任何文件 - 我可以 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

最佳答案

--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

也许你有不同的 tar ?

关于tar - 解压 tar 存档时删除目录结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7933680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com