解压时如何选择目录名称


124

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

Answers:


171

这应该工作:

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

我认为我会坚持使用愚蠢的版本:)
phunehehe 2011年

28
@phunehehe:智能版本的一个优点是您不必预先知道未加
扰的

2
我可以补充一点,这不仅适用于“ Pretty_name”。您也可以通过这种方式解压缩到特定目录。范例:tar -xvf /tmp/backupfiles.tar -C /var/www/
Redneck将军

2
我通常使用愚蠢的方式,并且在不知道丑陋的名字或者不想写下它的情况下使用通配符。 mv ugly-* pretty_name
David Grayson

1
如果已经有ugly_name目录,那么哑巴方式将不起作用。顺便说一句,情人眼里是美丽。
kmiklas

30

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!'

使用paxPOSIX存档实用程序,使用-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!'


7

最简单的方法

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

(1)这显然不是最简单的方法,如smac89张贴解答特色--one-top-level=pretty_name没有--strip-components 1。(2)相反,接受的答案(由Mat发布)的功能--strip-components 1没有--one-top-level=pretty_name。(3)您能否解释一下,结合这些选项,您的答案为什么比任何一个旧的都要好?请不要在评论中回复;编辑  您的答案,使其更清晰,更完整。
G人

也许一个真实的例子可以帮助你澄清:`wget的dev.mysql.com/get/Downloads/MySQL-5.7/...焦油xvf命令的mysql-23年7月5日- Linux的glibc2.12-x86_64.tar.gz --one顶-电平= mysql57 --strip组件1`
marquicus

这个答案比投票最多的人更优雅。
KaiserKatze

@ G-Man --strip-component 1是必需的,使用mkdir--strip-components 1方法,否则您将得到pretty_name/ugly_name/
davidA

这确实是最简单的方法
smac89

2

在askUbuntu中,此答案对我有用:

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

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

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


更新资料

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


这样做的问题是它没有重命名顶层目录,而是创建了一个名为的新级别pretty_name,其中包含原始的顶层目录。例如,如果tar xzf ugly_name.tgz将创建一个名为的目录ugly_name/,则将提供您提供的命令pretty_name/ugly_name/
davidA

1
@davidA好点。我更新了答案,包括对此问题的解决
smac89
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.