当我尝试tar
使用绝对路径压缩文件和目录时,绝对路径会保留在生成的压缩文件中。我需要使用绝对路径来告诉tar
我要压缩的文件夹的位置,但我只希望它压缩那个文件夹——而不是整个路径。
比如tar -cvzf test.tar.gz /home/path/test
——我要压缩文件夹的地方test
。但是,我实际上最终压缩的是/home/path/test
. 有什么办法可以避免这种情况吗?我试过玩 -C 操作数无济于事。
这很难看……但它有效……
我遇到了同样的问题,但是有多个文件夹,我只想将每个文件都展平。您可以使用选项“transform”来传递 sed 表达式,并且......它按预期工作。
这是表达式:
's/.*\///g'
(删除“/”之前的所有内容)
这是最后的命令:
tar --transform 's/.*\///g' -zcvf tarballName.tgz */*/*.info
用于-C
指定文件看起来像您想要的目录,然后指定从该目录看到的文件:
tar -cvzf test.tar.gz -C /home/path test
多目录示例
tar cvzf my.tar.gz example.zip -C dir1 files_under_dir1 -C dir2 files_under_dir2
dir 1/2 下的文件不应该有路径。
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
鉴于您所追求的文件,您必须判断什么最适合您的情况。