在进行枪压缩时使用 tar -xzvf 删除虚假目录

在进行枪压缩时使用 tar -xzvf 删除虚假目录

我想修剪压缩后的 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.txtl1file.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/...

相关内容