根据新信息,我重新表述了这个问题。旧信息如下,以免使基于它的答案和评论无效。
我有一个tarball.tar
要解压缩到的 tarball destination
,一个与我当前工作目录不同的目录,所以我使用 tar 的-C
选项,它可以满足我的需求。
但是,如果我尝试指定要从 tarball 中提取的文件,该-C
选项似乎被忽略了。这些文件被提取到我当前的工作目录中。
tar -xf tarball.tar -C destination
Tar的版本是
$ tar --version
tar (GNU tar) 1.28
这是一个错误还是我的理解-C
错误?
最小的工作示例
这是一个显示行为的 bash 脚本。将其存储(或执行)在空目录中
#!/bin/bash -x
set -e # Abort if any of these commands fails
touch file1 file2 file3 # Create files to be archived
tar -cf tarball.tar file1 file2 file3 # Create the archive
rm file1 file2 file3 # Remove source files
tar -tf tarball.tar # Should contain files 1–3
mkdir -p destination # Create destination directory
tar -xf tarball.tar file1 file2 -C destination # Extract two files from
#+ tarball into destination directory
ls . # Should contain only the script itself,
#+ tarball.tar, and destination
ls destination # Should contain file1 and file 2
如果我执行脚本,destination
则为空并ls .
返回
$ ls .
file1 file2 tarball.tar tar.sh
如果我没有指定要提取的文件(因此
tar -xf tarball.tar file1 file2 -C destination
第 9 行变为
tar -xf tarball -C destination
),则行为符合预期。ls destination
显示file1 file2 file3
。
老问题(忽略这个)
我有一个 tar 存档/path/to/backup.tar.gz
,其中包含目录home/bleistift2/stuff
和home/bleistift2/more_stuff
.
为了将这两个目录提取到/home/bleistift2/tmp
(在文件系统中,而不是存档中),我发出以下命令。我的理解是-C
指定提取位置。目标目录存在。
tar -zxvf /path/to/backup.tar.gz \ # The archive to extract
home/bleistift2/stuff home/bleistift2/more_stuff \ # The contents to extract
--same-owner -C /home/bleistift2/tmp # The destination directory
但是,这些目录存储为存档的兄弟姐妹,所以我最终使用/path/to/home/bleistift2/{stuff, more_stuff}
而不是/home/bleistift2/tmp/home/bleistift2/{stuff, more_stuff}
.
-C
字面意思是这样的cd
:所以,是的,顺序很重要。
更新:这个答案在编辑问题之前解决了这个问题,所以事实证明它不是对报告的实际问题的答案。我很快就会删除这个答案。
tar 提取的文件将包含完整的路径名,从您开始提取的位置开始。
因此,如果文件存储在带有名称的 tarball 中,
home/bleistift2/stuff
并且您将其解压缩到 下/home/bleistift2/tmp/
,您最终会得到/home/bleistift2/tmp/home/bleistift2/stuff
,因为 tar 无法知道您想要在提取过程中去除主目录前缀...您可以在提取过程中通过传递 tar
--strip-components
选项来控制此行为。从tar(1) 联机帮助页:
在您的具体情况下:
剥离 2 个组件将剥离基本
home/
目录以及用户的主目录。在您的具体情况下,这似乎是您想要的。作为更一般的建议,请尝试在创建期间防止此问题,方法是不要将文件路径的不相关或不需要的部分存储在 tarball 中,这在提取期间非常有用。
而不是使用绝对路径(或根目录的完整路径):
将目录更改为主目录并打包当前目录:
这样,文件将作为存档存储
./stuff
并存储./more_stuff
在其中,并且在提取文件时无需剥离任何组件。也可以使用
-C
切换目录的选项,相当于上面的命令: