如何使用 unzip 命令解压缩文件?

how to unzip a file using unzip command?

我有一个脚本可以创建一个名为“data”的文件夹。然后它使用 wget 下载一个文件,这些文件(.zip 格式)从当前目录移动到文件夹“数据”。之后我想要解压缩这些文件。我正在使用 unzip filename.zip,当我在 cmd 上使用它时它可以工作,但是我不知道为什么它在脚本中不起作用。

这是脚本:

#!/bin/bash

mkdir data

wget http://187.191.75.115/gobmx/salud/datos_abiertos/datos_abiertos_covid19.zip && mv datos_abiertos_covid19.zip data && unzip datos_abiertos_covid19.zip
wget http://187.191.75.115/gobmx/salud/datos_abiertos/diccionario_datos_covid19.zip && mv diccionario_datos_covid19.zip data && unzip diccionario_datos_covid19.zip

datos_abiertos_covid19.zipdiccionario_datos_covid19.zip 是我在文件夹中后要解压缩的文件“数据”。如果有人能帮助我,我将不胜感激。提前致谢!

它失败了,因为 unzip foo.zip 假定 foo.zip 在当前目录中,但您只是将它移动到子目录 data。交互地,您可能 cd data 首先,这就是它起作用的原因。

要使其在您的脚本中运行,只需将您的脚本 cd data 也包含在内:

#!/bin/bash
mkdir data
cd data || exit 1
wget http://187.191.75.115/gobmx/salud/datos_abiertos/datos_abiertos_covid19.zip && unzip datos_abiertos_covid19.zip

这样,文件直接下载到 data 目录,因此不需要 mv,并且解压缩命令按预期工作。

我的做法:

#!/bin/bash

set -e    # Exit if any command fails

mkdir data
pushd ./data >/dev/null

for i in 'datos_abiertos_covid19.zip' 'diccionario_datos_covid19.zip'; do
        # Don't unzip (or exit) if 'wget' fails, don't exit if 'unzip' fails
        wget "http://187.191.75.115/gobmx/salud/datos_abiertos/$i" -O "./$i" || continue
        unzip "./$i" || true
done

popd >/dev/null
  • 在这种情况下不需要引用文件名,但我还是这样做了,以强调你can/should必要时这样做
  • 如果您想构建一个更通用的 zip 文件下载脚本,您当然可以为文件列表、URL、下载目录等使用变量
  • 我知道它被标记为 bash,但值得一提的是:pushdpopd 未在 POSIX 中定义,您可以将它们更改为 cd ./datacd .. 以获得更多的可移植性。显然 wget 也不是 POSIX,但很常见(有关该主题的有趣信息,请参阅 this 主题)