解压时如何选择目录名

解压时如何选择目录名

假设我有一个名为 的文件ugly_name.tar,解压后将成为ugly_name目录。我可以使用什么命令来代替生成的目录名称pretty_name

答案1

这应该有效:

mkdir pretty_name && tar xf ugly_name.tar -C pretty_name --strip-components 1

-C解包(或打包)之前更改为指定目录。--strip-components从存档中存储的文件名中删除指定数量的目录。

请注意,这并不是真正的便携式。 GNU tar 和至少一些 BSD tars 有这个--strip-components选项,但在其他类 UNIX 平台上似乎不存在。

不过,这种愚蠢的做法几乎在任何地方都适用。

tar xf ugly_name.tar && mv ugly_name pretty_name

答案2

GNU 焦油≥1.16,使用--transform对每个文件名应用 sed regexp 转换(转换应用于存档中的完整路径):

tar xf foo.tar --transform 's!^ugly_name\($\|/\)!pretty_name\1!'

如果ugly_name是存档中所有文件名的顶级组成部分,则无需费心进行精确匹配:

tar xf foo.tar --transform 's/ugly_name/pretty_name/'

如果您不知道顶级目录的名称,您仍然可以使用此方法,尽管您可能更喜欢--strip-components反而。

tar xf foo.tar --transform 's!^[^/]\+\($\|/\)!pretty_name\1!'

pax,POSIX 归档实用程序,使用该-s选项,该选项采用类似 sed 的替换表达式作为参数。

pax -rf foo.tar -s '!^ugly_name\($\|/\)!pretty_name\1!'
pax -rf foo.tar -s '/ugly_name/pretty_name/'
pax -rf foo.tar -s '!^[^/]\+\($\|/\)!pretty_name\1!'

答案3

最简单的方法

tar xvf dml/ugly_name.tar --one-top-level=pretty_name --strip-components 1

答案4

编辑

正如中指出的评论,此方法不适用于正确形成的档案,但是另一个答案显示,您应该添加--strip-components 1它才能真正起作用。我已经使用这个新选项进行了测试,它既适用于具有顶级名称的档案,也适用于没有顶级名称的档案。


原答案

来自askUbuntu,这个回答为我工作:

tar zxvf ugly_name.tgz --one-top-level=pretty_name

`--one-top-level[=dir]'

告诉 tar 在提取目录(或传递给“-C”的目录)下创建一个新目录,并用它来防范 tarbomb。如果没有 dir 参数,新目录的名称将等于存档的基本名称(文件名减去存档后缀,如果可以识别)。任何不以该目录名称开头的成员名称(在从“--transform”和“--strip-components”转换之后)都将以其为前缀。可识别的文件名后缀为“.tar”,以及 See 可识别的任何压缩后缀-自动压缩

相关内容