下载文件并从Bash脚本文件解压缩

时间:2015-09-01 04:04:15

标签: linux bash

我正在下载文件,然后从Bash脚本文件中解压缩。

#!/bin/sh
wget -N http://example.com/file.zip
unzip -o file.zip

有没有办法检查wget是否实际下载了新文件?例如,如果file.zip的远程版本与本地版本相同,则它将不会检索该文件。如果wget实际检索到新文件,我只想解压缩文件。

4 个答案:

答案 0 :(得分:3)

您应该检查wget的返回值和输出,以确定文件是否已下载:

out=$(wget -qN 'http://example.com/file.zip' 2>&1)
[[ $? -eq 0 && $out ]] && unzip file.zip

如果file.zip已经存在相同的时间戳,则wget将不会下载它,并且不会将任何内容写入stdout / stderr,使out变量为空。

答案 1 :(得分:1)

请勿使用Last-Modified标头,该标头取决于服务器。 Anubhava @也可以使用,但这可以减少开销,在Bourne shell变体之间稍微便携一些:

这可以满足您的需求:

wget -N http://example.com/file.zip 2>&1  | grep "not retrieving" 2>&1 > /dev/null || unzip file.zip
  1. 获取档案
  2. 将stderr重定向到stdout
  3. 检查输出中是否“未检索”(未下载文件时打印的内容)
  4. 如果输出中不存在“not retrieval”字符串,则grep返回错误代码“1”并解压缩文件。否则,它只是默默地继续前进。
  5. 它基本上是这样说的,为了提高可读性而添加了更多细节:

    out=$(wget -N http://example.com/file.zip 2>&1)
    if [ $(echo $(out) | grep "not retrieving") ]; then
        echo "No new file; not unzipping"
    else
        unzip file.zip
    fi
    

答案 2 :(得分:0)

这是一个老问题,但不再工作了。 当我在2个案例中设置wget的quiet选项时,我没有任何返回,但是我们可以使用wget的-S选项获得HTML代码。

-200如果文件已下载

-304如果是同一个文件

- 其他......适用于所有“糟糕”的情况

没有改变@anubhava方法的解决方案:

out=$(wget -SN 'http://example.com/file.zip' 2>&1 | grep "HTTP/" | awk '{print $2}')
[[ $out -eq 200 ]] && unzip file.zip

答案 3 :(得分:-1)

您可以使用

curl -I http://example.com/file.zip

并检查Last-Modified:值。

您也可以使用wget --timestamping但请求HEAD信息,您可以更好地控制。