Unix tar:不保留目录结构

时间:2012-12-18 01:10:10

标签: shell unix tar

当我尝试使用绝对路径压缩tar的文件和目录时,绝对路径将保留在生成的压缩文件中。我需要使用绝对路径来告诉我要压缩的文件夹所在的tar,但我只希望它压缩该文件夹 - 而不是整个路径。

例如,tar -cvzf test.tar.gz /home/path/test - 我要压缩文件夹test。但是,我实际上最终压缩的是/home/path/test。有什么办法可以避免这种情况吗?我试过玩-C操作数无济于事。

4 个答案:

答案 0 :(得分:27)

这很难看......但它有效......

我有同样的问题,但有多个文件夹,我只是想把每个文件都弄平。您可以使用选项“transform”来传递sed表达式......它可以按预期工作。

这是表达式:

's/.*\///g'(删除'/'之前的所有内容)

这是最后一个命令:

tar --transform 's/.*\///g' -zcvf tarballName.tgz */*/*.info

答案 1 :(得分:21)

使用-C指定文件所需的目录 ,然后指定从该目录中看到的文件

tar -cvzf test.tar.gz -C /home/path test

答案 2 :(得分:1)

多目录示例

tar cvzf my.tar.gz example.zip -C dir1 files_under_dir1 -C dir2 files_under_dir2

目录1/2下的文件不应该有路径。

答案 3 :(得分:0)

tar可以在进出归档文件的过程中对文件名执行转换。考虑以下示例,该示例将一堆文件存储在一个平面的tarfile中:

在根〜/目录中

find logger -name \*.sh | tar -cvf test.tar -T - --xform='s|^.*/||' --show-transformed

-T -选项告诉tar从stdin中读取文件列表,--xform='s|^.*/||'将sed表达式应用于所有文件名,从读取它们开始到存储之后。 --show-transformed只是在转换文件名后向您显示文件名,默认是在读取文件名时显示它们。 毫无疑问,除了使用find来指定要存档的文件外,还有其他方法。例如,如果在bash中设置了dotglob,则可以使用**模式通配符任意数量的目录,从而将前一个目录缩短为:

tar -cvf test.tar --xform='s|^.*/||' --show-transformed logger/**/*.sh

考虑到要保存的文件,您必须判断最适合您的情况。