如何让脚本提取 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
进入的目录。