Bash 如何使用解压命令解压文件?

Bash 如何使用解压命令解压文件?,bash,zip,unzip,Bash,Zip,Unzip,我有一个脚本,它创建了一个名为“data”的文件夹。然后,它使用wget下载一个文件,并将这些文件(.zip格式)从当前目录移动到文件夹“data”中。之后,我想要的是解压缩这些文件。我使用的是解压filename.zip,当我在cmd上使用它时,它会工作,但是我不知道为什么它在脚本中不工作 以下是脚本: #!/bin/bash mkdir data wget http://187.191.75.115/gobmx/salud/datos_abiertos/datos_abiertos_co

我有一个脚本,它创建了一个名为“data”的文件夹。然后,它使用
wget
下载一个文件,并将这些文件(.zip格式)从当前目录移动到文件夹“data”中。之后,我想要的是解压缩这些文件。我使用的是
解压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.zip和diccionario_datos_covid19.zip是我在文件夹“data”中之后要解压缩的文件。如果有人能帮助我,我将不胜感激。提前谢谢

它失败,因为
解压foo.zip
假定
foo.zip
在当前目录中,但您刚刚将其移动到子目录
data
。以交互方式,您可能首先使用
cd数据
,这就是它工作的原因

要使其在脚本中工作,只需将脚本
cd数据也放在其中:

#!/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
,解压命令按预期工作。

它失败,因为
unzip foo.zip
假定
foo.zip
在当前目录中,但您只是将其移动到子目录
data
。以交互方式,您可能首先使用
cd数据
,这就是它工作的原因

要使其在脚本中工作,只需将脚本
cd数据也放在其中:

#!/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
这样,文件将直接下载到
数据
目录,因此不需要
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
  • 在这种情况下不需要引用文件名,但我还是这样做了,以强调您可以/应该在必要时这样做
  • 当然,如果您想要为下载zip文件构建更通用的脚本,那么您可以使用文件列表、URL、下载目录等变量
  • 我知道它标记为bash,但值得一提的是:
    pushd
    popd
    在POSIX中没有定义,您可以将它们更改为
    cd./data
    cd..
    ,以提高可移植性。显然,
    wget
    也不是POSIX,但非常常见(有关该主题的有趣信息,请参阅线程)
    • 我的方法:

      #!/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
      
      • 在这种情况下不需要引用文件名,但我还是这样做了,以强调您可以/应该在必要时这样做
      • 当然,如果您想要为下载zip文件构建更通用的脚本,那么您可以使用文件列表、URL、下载目录等变量
      • 我知道它标记为bash,但值得一提的是:
        pushd
        popd
        在POSIX中没有定义,您可以将它们更改为
        cd./data
        cd..
        ,以提高可移植性。显然,
        wget
        也不是POSIX,但非常常见(有关该主题的有趣信息,请参阅线程)

      mv datos\u abiertos\u covid19.zip data
      -您正在移动/重命名文件Yep,如果没有名为data的目录,
      mv
      将您的zip文件重命名为data,解决方法是在目录中添加一个尾随斜杠,在这种情况下,
      data/
      因此mv将错误地发出一条消息,指出没有名为
      data/
      的目录,这与将文件重命名为数据相反。@Jetchisel:可能有一个同名目录(请参阅前面的
      mkdir
      命令)。
      mv datos\u abiertos\u covid19.zip data
      -您正在移动/重命名文件,如果没有名为data的目录,
      mv
      会将您的zip文件重命名为data,解决方法是在目录中添加一个尾随斜杠,在这种情况下,
      data/
      ,因此mv会错误地显示一条消息,即没有名为data的目录,与仅将文件重命名为数据相反。@Jetchisel:可能有一个同名目录(请参阅前面的
      mkdir
      命令)。
      mkdir-p data
      会更好吗?@jared\u mamrot:更好,因为如果目录已经存在,您不会收到错误消息。另一种方法是执行
      [[-d data]]| | mkdir data
      mkdir-p data
      会更好吗?@jared_mamrot:更好,因为如果目录已经存在,您不会收到错误消息。另一种方法是执行
      [[-d data]]| | mkdir data