如何在解压过程中选择目录名称

tsh*_*ang 164 tar rename

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

Mat*_*Mat 224

这应该有效:

mkdir pretty_name && tar xf ugly_name.tar -C pretty_name --strip-components 1
Run Code Online (Sandbox Code Playgroud)

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

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

不过,这样做的愚蠢方法几乎可以在任何地方使用。

tar xf ugly_name.tar && mv ugly_name pretty_name
Run Code Online (Sandbox Code Playgroud)

  • @phunehehe:智能版本的一个优点是你不必事先知道解压缩的目录名称是什么 (46认同)
  • 我可以补充一下,这不仅仅适用于“Pretty_name”。您也可以通过这种方式解压到特定目录。示例:`tar -xvf /tmp/backupfiles.tar -C /var/www/` (2认同)
  • 我通常使用愚蠢的方式,我使用通配符以防我不知道丑陋的名字是什么或者我不想写下来。`mv 丑陋-* 漂亮名字` (2认同)
  • 如果已经有一个 ``ugly_name`` 目录,愚蠢的方式将不起作用。顺便说一句,美丽在旁观者的眼中。 (2认同)

Gil*_*il' 35

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

tar xf foo.tar --transform 's!^ugly_name\($\|/\)!pretty_name\1!'
Run Code Online (Sandbox Code Playgroud)

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

tar xf foo.tar --transform 's/ugly_name/pretty_name/'
Run Code Online (Sandbox Code Playgroud)

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

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

对于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!'
Run Code Online (Sandbox Code Playgroud)


小智 15

最简单的方法

tar xvf dml/ugly_name.tar --one-top-level=pretty_name --strip-components 1
Run Code Online (Sandbox Code Playgroud)

  • (1) 这显然不是最简单的方法,因为 [smac89 发布了一个答案](https://unix.stackexchange.com/q/11018/80216#448326) 以 ``--one-top-level=pretty_name` 为特色` 没有 ``--strip-components 1``。(2) 相反,[接受的答案(由 Mat 发布)](https://unix.stackexchange.com/q/11018/80216#11019) 具有 `--strip-components 1` 没有 `--one-top -level=pretty_name`。(3) 你能解释为什么你的答案,结合这些选项,比任何一个旧的都好?请不要在评论中回复;[编辑] 您的答案,使其更清晰、更完整。 (2认同)
  • 这确实是最简单的方法 (2认同)

小智 10

用这个 :

tar -xvf ugly_name.tar
mv ugly_name pretty_name
Run Code Online (Sandbox Code Playgroud)

  • 您可能更喜欢在这两个命令之间使用 `&&` 列表运算符,因此只有在第一个成功时才会执行第二个。 (10认同)
  • 如果目录 `ugly_name` 已经存在,这可能会产生不良后果。 (3认同)