假设我有一个名为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 tar具有--strip-components选项,但在其他类似unix的平台上似乎不存在。

tar xf ugly_name.tar && mv ugly_name pretty_name


评论


我想我会坚持使用愚蠢的版本:)

– phunehehe
2011年4月11日在2:25

@phunehehe:智能版本的一个优点是您不必事先知道什么是未标记的目录名

– tshepang
2011年4月12日10:00



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

–一般乡下人
16年1月23日在2:28

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

–大卫·格雷森(David Grayson)
17年7月26日在5:14

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

– kmiklas
19年4月23日在14:51

#2 楼

在GNU tar≥1.16的情况下,请使用--transform将sed正则表达式转换应用于每个文件名(该转换应用于归档文件的完整路径):
ugly_name是归档文件中所有文件名的顶级组件,您无需为精确匹配而烦恼:

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


如果您不知道文件名在顶层目录中,尽管您可能更喜欢使用--strip-components,但仍然可以使用此方法。以类似sed的替换表达式作为参数。

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


#3 楼

最简单的方法

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


评论


(1)这显然不是最简单的方法,因为smac89发布了一个具有--one-top-level = pretty_name而没有--strip-components1的答案。(2)相反,被接受的答案(由Mat发布)具有-带--one-top-level = pretty_name的strip-components1。 (3)您能否解释一下,结合这些选项,您的答案为什么比任何一个旧的都要好?请不要回应发票;编辑您的答案,使其更清晰,更完整。

– G-Man说“恢复莫妮卡”
18/09/21在3:31

也许一个真实的例子可以帮助您阐明:`wgetdev.mysql.com/get/Downloads/MySQL-5.7/…tar xvf mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz --one-top -level = mysql57 --strip-components 1`

–侯爵夫人
18-09-22在4:11



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

– KaiserKatze
19年5月21日在15:46



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

– davidA
19-09-24在23:14

这确实是最简单的方法

–smac89
19/09/25'1:35

#4 楼

使用这个:

tar -xvf ugly_name.tar
mv ugly_name pretty_name


评论


您可能希望在这两个命令之间使用&& list运算符,因此仅当第一个成功时才执行第二个命令。

–manatwork
2012年10月12日上午9:48

如果目录ugly_name已经存在,则可能会产生不良后果。

–德鲁·多曼(Drew Dormann)
17年5月12日在22:05

#5 楼

编辑

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

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



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

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


评论


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

– davidA
19-09-24在23:12

@davidA好点。我已经更新我的答案以包括对此的修复

–smac89
19-09-25在1:39