创建不同位置的多个目录的 tar.gz 存档 - “tar:懦弱地拒绝创建空存档”

Joh*_*sua -2 linux command-line tar archive gzip

我正在尝试创建一个存档:

$ cd /tmp
$ tar -czf test1.tar.gz -C ~/Downloads/dir1 -C ~/Documents/dir2 -C ~/dir3/dir4/dir5
Run Code Online (Sandbox Code Playgroud)

...这不应该保留其中目录的完整路径,因此-C

结果

tar: Cowardly refusing to create an empty archive
Try 'tar --help' or 'tar --usage' for more information.

Run Code Online (Sandbox Code Playgroud)

为什么?如何修复它?

tel*_*coM 5

您的命令在概念上等同于:

tar -czf test1.tar.gz -C ~/Downloads/dir1 "" -C ~/Documents/dir2 "" -C ~/dir3/dir4/dir5 ""
Run Code Online (Sandbox Code Playgroud)

用人类的话来说:

  • tar -czf test1.tar.gz:“制作一个名为test1.tar.gz当前工作目录的 gzipped tar 存档,如下所示:...”
  • -C ~/Downloads/dir1 "":“...首先,切换到目录~/Downloads/dir1,然后从那里归档任何内容...”
  • -C ~/Documents/dir2 "":“...然后,切换到目录~/Documents/dir2并从那里归档任何内容...”
  • -C ~/dir3/dir4/dir5 "":“......最后,切换到~/dir3/dir4/dir5那里也不存档任何内容。”

你可能想要这样的东西:

tar -czf test1.tar.gz -C ~/Downloads/dir1 . -C ~/Documents/dir2 . -C ~/dir3/dir4/dir5 .
Run Code Online (Sandbox Code Playgroud)

这会将“不存档”部分替换为“存档当前目录的内容”,后者刚刚切换为使用该-C选项。

dir1请注意,当您提取生成的存档时, 、dir2和的存档内容dir5将全部提取到提取时的当前目录中。如果这就是您想要的,那就很好,但这是一个稍微不寻常的用例。(这样的存档被称为焦油炸弹,当意外遇到时通常不受欢迎,因为它不会整齐地提取到提取过程创建的单个目录中。)

为了便于解释,这里有一个略有不同的命令:

tar -czf test2.tar.gz -C ~/Downloads dir1 -C ~/Documents dir2 -C ~/dir3/dir4 dir5
Run Code Online (Sandbox Code Playgroud)

test2.tar.gz提取时,将导致:

./dir1
./dir2
./dir5
Run Code Online (Sandbox Code Playgroud)

...及其内容。