22

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

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

4

4 回答 4

35

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

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

这是表达式:

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

这是最后的命令:

tar --transform 's/.*\///g' -zcvf tarballName.tgz */*/*.info
于 2014-09-19T11:11:29.217 回答
28

用于-C指定文件看起来像您想要的目录,然后指定从该目录看到的文件

tar -cvzf test.tar.gz -C /home/path test
于 2012-12-18T01:17:04.183 回答
3

多目录示例

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

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

于 2017-09-18T19:32:08.367 回答
0

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

在根 ~/ 目录中

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

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

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

鉴于您所追求的文件,您必须判断什么最适合您的情况。

于 2020-11-20T16:01:26.173 回答