【问题标题】:Rename Directory Name Before tar Happens在 tar 发生之前重命名目录名称
【发布时间】:2012-04-01 13:19:12
【问题描述】:

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

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

稍后,当我解压缩 my-dir.tar.gz 时,它会在当前目录中创建 my-dir/。听起来my-dir 目录被“包装”在压缩包中。是否有一个 tar 选项可以将my-dir 重命名为例如your-dir 实际焦油化发生之前。这样……

$ tar -zxf my-dir.tar.gz
# So that ... this creates your-dir/, instead of my-dir/

谢谢。

【问题讨论】:

    标签: bash shell command-line tar


    【解决方案1】:

    派对迟到了,但这是我久经考验的方法。当我有一个提取到我不喜欢的顶级目录名称的 tar 文件时,我通过创建我喜欢的目录名称然后使用带有 -C--strip-component 选项的 tar 来解决它。

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

    -C 就像在您指定的目录中一样提取,而--strip-component 表示忽略存储在 tar 文件内容中的第一级。

    乍一看,这种方法可能不如其他人给出的 sed 风格的解决方案那么优雅,但我认为这种方法确实有一些优点。

    【讨论】:

    • 在 Ubuntu 20 上运行良好!
    • 当您不知道根目录名称时,这是一个更好的解决方案。例如,当需要构建ImageMagick 时,您可以下载源代码,其中包含版本化的根目录名称。当需要自动执行此操作时,如果您不知道源的实际版本,则不能使用其他方法。当然,它可以实现,但使用这个答案更容易。
    【解决方案2】:

    对于 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)
    • 有人知道如何转义 sed 字符串中的字符吗?我尝试了反斜杠(带和不带引号)——但总是从 tar 中得到一个错误。特别是我想将.svn/patches 转换为__patches,例如-s /^\.svn\/patches/__patches/。我注意到-s /^.svn.patches/__patches/ 有效,但我宁愿更明确。
    • 我得到了答案 here - 显然 tar 在转义分隔符时有问题,所以答案是使用不同的分隔符。
    • MacOS 有它自己的专有 tar 选项吗?糟糕。
    • 这个答案稍微好一点,但它仍然可以破坏以字符串 my-dir 开头的符号链接。这是因为符号链接可以是相对的,它所指的 my-dir 可能不在 tar 文件的顶层。
    【解决方案3】:

    哪个tar

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

    例如,在解包过程中重命名:

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

    BSD tar 和 Star 类似地有一个 -s 参数,采用简单的 /old/new/(不是一般的 sed 表达式)。

    【讨论】:

    • @ephemient,我不得不使用 --transform='pattern',例如:sudo tar -xjvf Thunderbird-14.0.tar.bz2 --transform='s/thunderbird(\/)/thunderbird .14\1/' 与 ln -sf Thunderbird.14 雷鸟,更新雷鸟不会有问题! \m/
    • --transform 在 1.2 中引入,不幸的是 RHEL 和 CentOS 5.10 只带有 tar v1.15 :(
    • BSD tar 似乎没有 --transform 选项,所以在 MacOS 上不确定这是否可行
    • 此答案将无法正常工作。它将破坏目录中所有具有包含字符串my-dir 的目标的符号链接。
    猜你喜欢
    • 2018-05-01
    • 2017-03-28
    • 2020-04-30
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    • 2020-08-16
    • 2012-03-13
    相关资源
    最近更新 更多