Answers:
这应该工作:
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
tar -xvf /tmp/backupfiles.tar -C /var/www/
mv ugly-* pretty_name
ugly_name
目录,那么哑巴方式将不起作用。顺便说一句,情人眼里是美丽。
在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!'
用这个 :
tar -xvf ugly_name.tar
mv ugly_name pretty_name
&&
在这两个命令之间使用列表运算符,因此仅在第一个命令成功的情况下才执行第二个命令。
ugly_name
已经存在,这可能会产生不良后果。
最简单的方法
tar xvf dml/ugly_name.tar --one-top-level=pretty_name --strip-components 1
--one-top-level=pretty_name
没有--strip-components 1
。(2)相反,接受的答案(由Mat发布)的功能--strip-components 1
没有--one-top-level=pretty_name
。(3)您能否解释一下,结合这些选项,您的答案为什么比任何一个旧的都要好?请不要在评论中回复;编辑 您的答案,使其更清晰,更完整。
--strip-component 1
是必需的,使用mkdir
或--strip-components 1
方法,否则您将得到pretty_name/ugly_name/
。
在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/
。