2015-09-01 94 views
3

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

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

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

+2

校验,并与前值(存储在一个txt的地方) – Alfabravo

+1

两个'curl'和'wget'可以说,如果没有改变不下载文件进行比较。请参阅http:// stackoverflow。com/q/32322456/258523获得关于'wget'的最新问题和回答。 –

回答

3

你应该检查返回值,从wget输出找出文件是否已经被下载:

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

如果file.zip已经存在具有相同的时间戳,然后wget不会下载它并没有什么会被写入到stdout/stderr使out变空。

+0

我在最后一行发现错误“[[:not found]”。另外,是否可以在将其分配给输出时显示输出? –

+1

'[[''not found意味着你没有使用bash。确保在运行时使用'bash'。要显示输出,你可以在第一行之后加上'echo“$ out”'。 – anubhava

-1

您可以使用

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

,并检查Last-Modified:值。

您也可以使用wget --timestamping,但要求HEAD信息您有更多的控制权。

1

请勿使用Last-Modified标头,这取决于服务器。 Anubhava @'S还工作,但这个开销少,稍微更便携Bourne shell的变化之间:

这得到你所需要的:

wget -N http://example.com/file.zip 2>&1 | grep "not retrieving" 2>&1 > /dev/null || unzip file.zip 
  1. 获取文件
  2. 重定向错误输出到标准输出
  3. 检查是否输出“not retrieve”(当没有下载文件时打印什么)
  4. 如果输出中不存在“not retrieve”字符串,则grep返回错误代码'1 '并且文件解压缩。否则,它只是静静地移动。

它本质上是这样说,与增加了可读性更详细:

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 
0

这是一个老问题,但不工作了。 当我在2个案例中设置wget的安静选项时,我没有任何回报,但是我们可以使用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