我正在下载文件,然后从Bash脚本文件中解压缩。
#!/bin/sh
wget -N http://example.com/file.zip
unzip -o file.zip
有没有办法检查wget
是否实际下载了新文件?例如,如果file.zip
的远程版本与本地版本相同,则它将不会检索该文件。如果wget
实际检索到新文件,我只想解压缩文件。
答案 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
它基本上是这样说的,为了提高可读性而添加了更多细节:
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信息,您可以更好地控制。