如何解压文件夹并将目录更改为解压缩的文件夹

如何解压文件夹并将目录更改为解压缩的文件夹

我正在尝试制作一个脚本,在其中可以解压缩文件,然后 cd 到该解压缩的文件中(即解压缩 test.zip,然后 cd 到 test 文件夹)。问题是 zip 文件的名称各不相同,我正在尝试编写一个无论名称如何都可以工作的脚本。

目前,我有:

for file in $(ls *.zip);
do
        unzip ${file}
        cd ${file};
done

但我收到错误,因为 ${file} 仍然是 .zip 文件(如果我正确理解错误)。

有什么建议么?

谢谢。

编辑:为了澄清,我正在尝试对 .zip 文件内的文件进行分析。所以我认为我的目标是首先解压缩文件(然后将创建一个与 zip 文件同名的目录,但不带 .zip),然后 cd 进入该目录。一旦进入该目录,我就会有另一行代码来开始分析文件。

答案1

假设 i) zip 文件创建一个新目录,并且 ii) 该目录的名称与 zip 文件的名称相同(不带扩展名).zip(请注意,这两个假设通常都是错误的),那么您可以执行以下操作:

for file in *.zip
do
    unzip -- "$file"
    cd -- "${file%%zip}"
done

,或者更一般地${file%%zip},语法将返回删除${variable%%pattern}的值。如果文件名是则返回。$variablepattern${file%%zip}foofoo.zip

它们--表示选项的结束,如果您的文件名以-.另请注意,根本不需要使用ls,这是一件非常好的事情,因为解析了ls 非常脆弱,从不推荐

您可以通过首先确保目录存在来使此过程变得更复杂:

for file in *.zip
do
    unzip -- "$file"
    [ -d "${file%%zip}" ] && cd -- "${file%%zip}"
done

请注意,仅当您现在想要在目录中运行的脚本中执行操作时,这才有用。否则,如果您希望运行此命令并且当前的 shell 会话现在位于目标目录中,则不会发生这种情况,因为它cd不会影响运行脚本的 shell,而该 shell 不是您从中启动脚本的 shell。

因此,如果您希望这是一种提取文件、移动到新目录,然后在交互式 shell 会话中执行操作的方法,则需要将其设为函数而不是脚本:

unzipcd(){
    for file in *.zip
    do
        unzip -- "$file"
        [ -d "${file%%zip}" ] && cd -- "${file%%zip}"
    done
}

相关内容