解压 tar 然后进入其目录(shell 脚本)

解压 tar 然后进入其目录(shell 脚本)

如何让脚本提取 tar 然后进入提取的 tar 目录?

我正在尝试

提取

#!/bin/bash
tar -xvf $1 && cd $1

使用示例

假设有foo.tar.xz 这样的使用方法:./xtract foo.tar.xz

所以你可以看到我的问题是在参数中,我成功提取它但由于文件扩展名而无法输入它。那么我如何在参数中删除它以便我可以进入foo目录

答案1

shell 脚本永远无法更改其父进程(调用脚本的 shell)的工作目录。因此,尽管您可以更改到创建的目录脚本,一旦脚本终止(并且其环境被破坏,包括特定目录是进程的当前目录的事实),您将发现自己位于执行脚本时所在的目录中。

但是,shell 函数在当前 shell 会话中执行,并且可以按照cd您期望的方式设置会话的当前工作目录。

以下是一个 shell 函数,它尝试提取tar命令行上给出的存档,如果成功,则更改为存档名称提供的目录,并.tar从末尾删除(这是使用标准参数扩展)。

xtract () {
    tar -x -v -f "$1" &&
    cd -- "${1%.tar}"
}

您可以通过将上述内容粘贴到 shell 中来定义此函数,也可以将其添加到通常添加 shell 函数和别名的位置,并且它将在您启动的下一个 shell 会话中可用。

如果您想支持xz压缩tar存档,您可能需要更改上述函数,以便它使用正确的选项tar或您的系统(-J--xz使用 GNU tar,例如),或通过xz -d -c -- "$1"管道将存档传递到tar -x -v -f -.您还必须调整该cd命令,以便它删除.tar.xz而不是仅从.tar给定存档文件名的末尾删除。

如果您足够聪明tar,可以使用文件名后缀来正确确定压缩算法,那么您可以使用

xtract () {
    tar -x -v -f "$1" &&
    cd -- "${1%.tar.*}"
}

与前一个函数的区别在于,我们先剥离.tar后跟一个点,然后任何字符串从存档名称的末尾开始到达我们尝试cd进入的目录。

相关内容