我想修剪压缩后的 tarball 的路径,以便排除一些“虚假”的前导目录。让我用一个例子来解释一下。
我有以下目录结构,由tree
命令输出:
tree /tmp/gzip-expt
/tmp/gzip-expt
├── gunzip-dir
├── gzip-dir
└── repo
└── src-tree
├── l1file.txt
└── sub-dir
└── l2file.txt
5 directories, 2 files
我想将 src-tree 压缩到 gzip-dir 中,所以这就是我所做的:
cd /tmp/gzip-expt/gzip-dir
tar -czvf file.tar.gz /tmp/gzip-expt/repo/src-tree
随后我在gunzip-dir中gunzip file.tar.gz,这就是我所做的:
cd /tmp/gzip-expt/gunzip-dir
tar -xzvf /tmp/gzip-expt/gzip-dir/file.tar.gz
tree /tmp/gzip-expt/gunzip-dir
显示以下输出:
/tmp/gzip-expt/gunzip-dir
└── tmp
└── gzip-expt
└── repo
└── src-tree
├── l1file.txt
└── sub-dir
└── l2file.txt
但是,我想tree /tmp/gzip-expt/gunzip-dir
显示以下输出:
/tmp/gzip-expt/gunzip-dir
└── src-tree
├── l1file.txt
└── sub-dir
└── l2file.txt
换句话说,我不想看到路径的“虚假”tmp/gzip-expt/repo 部分。
答案1
它们不是假的,它只是准确地存储了被告知要存储的内容。
特别是,给定路径/tmp/gzip-expt/repo/src-tree
,它无法知道应该保留路径的哪些部分,文件是否应存储为/tmp/gzip-expt/repo/src-tree/l1file.txt
, 或src-tree/l1file.txt
等l1file.txt
。如果存档具有前导目录,则在提取 tarball 时会有所不同,它是在提取时创建的。如果没有,那就不是。
给出tar
一个相对路径,并让它在正确的目录中运行以使相对路径正常工作:
cd /tmp/gzip-expt/repo
tar -czvf /tmp/gzip-expt/gzip-dir/file.tar.gz ./src-tree
或者
cd /tmp/gzip-expt/gzip-dir
tar -C /tmp/gzip-expt/repo -czvf file.tar.gz ./src-tree
GNU 手册页描述-C
为:
-C
,--directory=DIR
在执行任何操作之前更改为 DIR。该选项是顺序敏感的,即它影响后面的所有选项。
但据我所知,即使首先给出,仍然从启动的-f
目录中使用给出的文件。tar
-C
如果你想在提取时修复它,至少 GNU tar告诉它删除文件名的前导部分。例如,使用,类似的文件名将被提取为.--strip-components=N
--strip-components=2
/tmp/gzip-expt/repo/src-tree/...
repo/src-tree/...