我正在尝试制作一个脚本,在其中可以解压缩文件,然后 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}
的值。如果文件名是则返回。$variable
pattern
${file%%zip}
foo
foo.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
}