我想制作一个 tar 存档,其中包含分散在文件系统中的各种文件:
$ tar czvf outfile.tar.gz /some/file /some/other/filename
这成功创建了存档,但是当我提取它时,文件仍然位于与原始位置匹配的目录树中:
$ tar xvf outfile.tar.gz
some/file
some/other/filename
我希望将它们都提取到当前目录,以便file
和filename
自行创建。
我可以在提取时使用 执行此操作--transform
,例如:
$ tar xvf outfile.tar.gz --transform=s,.*/,,
这满足了我的要求,但是在提取时必须使用晦涩的选项有点烦人,使得发送给其他人变得更加困难,等等。
我可以在创建时这样做:
$ cd tmpdir
$ cp /some/file /some/other/filename .
$ tar czvf outfile.tar.gz *
但这似乎有点重量级,特别是当文件很大或很多时。
有没有办法直接控制tar
创建时存储的文件名?
答案1
--transform
那么创建存档时不起作用吗?它似乎适用于我的 GNU tar 1.27.1:
$ tar czf out.tar.gz some/foo some/other/bar --transform=s,.*/,,
$ tar tzf out.tar.gz
foo
bar
如果它不起作用,另一种可能性是链接到当前目录中的文件(就像您对 所做的那样cp
,但使用ln
):
$ ln /some/foo /some/other/bar .
$ tar czf out.tar.gz foo bar
答案2
有一个非常有用的工具,叫做迟迟可用于编辑tar
文件:
tardy -Remove_Prefix 55 outfile.tar.gz transformed.tar.gz
这55
是大于 中所有目录的最大深度的任意数字outfile.tar.gz
。 -Remove_Prefix 55
告诉tardy
从文件名中删除(最多)55 个前导目录。