it-swarm.cn

解压时如何选择目录名称

假设我有一个名为ugly_name.tar的文件,提取后该文件将成为ugly_name的目录。我可以使用什么命令将生成的目录名称改为pretty_name

132
tshepang

这应该工作:

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

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

请注意,这不是真正可移植的。 GNU tar,至少某些BSD tar具有--strip-components选项,但在其他类似unix的平台上似乎不存在。

但是,愚蠢的方式在任何地方都可以使用。

tar xf ugly_name.tar && mv ugly_name pretty_name
187
Mat

GNU tar ≥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!'
32

最简单的方法

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

用这个 :

tar -xvf ugly_name.tar
mv ugly_name pretty_name
9
Rupesh Mande

在askUbuntu中,这 answer 对我有用:

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

`-顶层[= dir]'

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


更新资料

正如 comments 中指出的那样,此方法不适用于格式正确的档案,但是 另一个答案 所示,您应添加--strip-components 1才能真正起作用。我已经使用此新选项进行了测试,它既适用于具有顶级名称的存档,也适用于不具有顶级名称的存档。

3
smac89