在 tar 压缩之前重命名目录名称

62

我有一个目录,例如 /var/tmp/my-dir/,我经常使用以下命令进行压缩:

$ cd /var/tmp/
$ tar -zcf my-dir.tar.gz my-dir/*

稍后,当我解压缩my-dir.tar.gz时,它会在当前目录下创建my-dir/。听起来像是my-dir文件夹被“包裹”在tarball里。是否有一个tar选项可以在实际打包之前将my-dir重命名为例如your-dir?这样就可以...

$ tar -zxf my-dir.tar.gz
# So that ... this creates your-dir/, instead of my-dir/
感谢。
3个回答

94

哪个tar

GNU Tar接受一个--transform参数,你可以给它一个sed表达式来操作文件名。

例如,在解压缩时进行重命名:

tar -zxf my-dir.tar.gz --transform s/my-dir/your-dir/

BSD tar 和 S tar 都有一个 -s 参数,它接受一个简单的 /old/new/ 格式的字符串(不是一个通用的 sed 表达式)。


1
@ephemient,我不得不使用--transform ='pattern',例如: sudo tar -xjvf thunderbird-14.0.tar.bz2 --transform ='s/thunderbird(/)/thunderbird.14\1/' 通过ln -sf thunderbird.14 thunderbird,更新Thunderbird将不会成为问题! \m/ - Rodrigo Gurgel
1
很不幸,RHEL和CentOS 5.10只提供tar v1.15,而--transform是在1.2版本中引入的。 - Aaron R.
BSD tar似乎没有--transform选项,因此在MacOS上不确定是否有效。糟糕! - Alexander Mills
1
这个答案不会正确工作。它会破坏目录中所有符号链接,其中包含一个目标,该目标包含字符串 my-dir - Alistair Buxton

19

对于Mac电脑,可以使用-s标志。

在压缩时重命名:

tar -zcf my-dir.tar.gz -s /^my-dir/your-dir/ my-dir/*

在提取时重命名:

tar -zxf my-dir.tar.gz -s /^my-dir/your-dir/


很好,谢谢!我需要这个答案因为我在使用 MacOS(我认为它使用的是 BSD tar,而不是 GNU tar)。 - Alexander Mills
有人知道如何在sed字符串中转义字符吗?我尝试过反斜杠(带引号和不带引号)-但总是从tar中得到错误。特别是我想将.svn/patches转换为__patches,例如-s /^\.svn\/patches/__patches/。我注意到-s /^.svn.patches/__patches/可以工作,但我宁愿更加明确。 - user9645
我在这里得到了答案(https://stackoverflow.com/a/54110456/1571426)- 显然,当转义定界符时,tar存在问题,因此答案是使用不同的定界符。 - user9645
MacOS有自己专有的tar选项?呸。 - Cerin
不幸的是,在Windows 10上内置的BSD tar无法使用此功能。该发行版中不存在“-s”选项。 - kakyo
显示剩余2条评论

13

虽然我来晚了,但这是我经过时间考验的方法。当我有一个tar文件,可以提取出一个顶层目录名称,而我不喜欢它时,我会通过创建我喜欢的目录名称,然后使用tar和-C--strip-component选项来解决它。

mkdir your-dir && tar -zxvf my-dir.tar.gz -C your-dir --strip-components=1

-C选项会像你指定的目录一样提取文件,而--strip-component选项则表示忽略存储在tar文件内容中的第一层级别。

乍一看,这种方法可能比其他人提供的sed风格解决方案要不够优雅,但我认为这种方式确实有一些优点。


在Ubuntu 20上运行得非常好! - Binita Bharati
这是一个更好的解决方案,当您不知道根目录名称时。例如,需要构建ImageMagick时,可以下载包含版本化根目录名称的源代码。当需要自动化此过程时,如果您不知道源代码的实际版本,则无法使用其他方法。当然,可以实现它,但使用这个答案会更容易。 - yaroslavche

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接