当我尝试使用绝对路径压缩tar
的文件和目录时,绝对路径将保留在生成的压缩文件中。我需要使用绝对路径来告诉我要压缩的文件夹所在的tar
,但我只希望它压缩该文件夹 - 而不是整个路径。
例如,tar -cvzf test.tar.gz /home/path/test
- 我要压缩文件夹test
。但是,我实际上最终压缩的是/home/path/test
。有什么办法可以避免这种情况吗?我试过玩-C操作数无济于事。
答案 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
考虑到要保存的文件,您必须判断最适合您的情况。