如何使用“tar”命令将文件解压缩到另一个目录?

sha*_*xuc 794 tar

我以为tar archive.tar /users/mylocation会工作,但它没有。我怎样才能做到这一点?

小智 1110

要将存档解压缩到与当前目录不同的目录,请使用-C, 或--directorytar 选项,如

tar -xf archive.tar -C /target/directory
Run Code Online (Sandbox Code Playgroud)

请注意,在运行该命令之前,目标目录必须存在(它可以由 来创建mkdir /target/directory)。

阅读手册页(命令:)以man tar了解其他选项。

  • 令人惊讶的是,经过这么多年,随着`tar` 的所有选项的积累,仍然没有一个选项来*创建不存在的输出目录*? (23认同)
  • @consultstan https://xkcd.com/1168/ (14认同)
  • 如果它是一个更大的文件,当你运行命令时,你得到的只是在它工作的几秒钟甚至几分钟内没有输出。您可以通过添加 `-v` 标志(_verbose mode_)来解决这个问题,该标志会在提取文件时列出每个文件的名称。 (3认同)
  • 我完全同意,如果输出目录不存在,应该有一个选项来*创建*输出目录。否则,您可以提取文件并使用“mv”。 (2认同)

Bry*_*sen 297

请注意,如果您的 tarball 已经包含要更改的目录名称,请添加--strip-components=1选项:

tar xf archive.tar -C /target/directory --strip-components=1
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你。通过 wget/etc 下载总是有一个“父”目录。这是imo的完整答案 - 或者应该在上面的答案中注明。 (2认同)
  • 正是我一直在寻找的东西。当运行可能使用不同版本的配置程序时,“--strip-components”非常有用。这样,“/target/directory”就可以是通用名称,而不必担心提供者如何选择命名其存档文件夹。 (2认同)

Tha*_*wda 35

结合之前的回答和评论:

简单地提取内容并在缺少时创建目标目录:

mkdir -p /target/directory && tar xf archive.tar -C /target/directory
Run Code Online (Sandbox Code Playgroud)

提取并删除 zip 中的根(第一级)目录

mkdir -p /target/directory && tar xf archive.tar -C /target/directory --strip-components=1
Run Code Online (Sandbox Code Playgroud)


小智 30

另一种选择是使用 --one-top-level。这将根据原始文件名自动创建一个目录。

tar zxvf filename.tgz --one-top-level
Run Code Online (Sandbox Code Playgroud)

此外,如果需要,您可以指定自己的,tar 将自动创建它。

tar zxvf filename.tgz --one-top-level=new_directory
Run Code Online (Sandbox Code Playgroud)

  • 我正在使用 GNU tar 1.26 并且我收到了一个无法识别的选项错误“--one-top-level” (4认同)
  • 对于 macOS 上的任何人,您都需要使用“brew install gnu-tar”安装“gnu-tar”,然后使用“gtar”来获取此命令行选项。 (2认同)