我正在下载文件,然后从Bash脚本文件中解压缩它。从Bash脚本文件下载文件并解压缩
#!/bin/sh
wget -N http://example.com/file.zip
unzip -o file.zip
有没有办法检查wget
是否实际下载了一个新文件?例如,如果远程版本file.zip
与本地版本相同,则不会检索该文件。我只想解压该文件,如果wget
实际上检索一个新文件。
我正在下载文件,然后从Bash脚本文件中解压缩它。从Bash脚本文件下载文件并解压缩
#!/bin/sh
wget -N http://example.com/file.zip
unzip -o file.zip
有没有办法检查wget
是否实际下载了一个新文件?例如,如果远程版本file.zip
与本地版本相同,则不会检索该文件。我只想解压该文件,如果wget
实际上检索一个新文件。
你应该检查返回值,从wget
输出找出文件是否已经被下载:
out=$(wget -qN 'http://example.com/file.zip' 2>&1)
[[ $? -eq 0 && $out ]] && unzip file.zip
如果file.zip
已经存在具有相同的时间戳,然后wget
不会下载它并没有什么会被写入到stdout/stderr使out
变空。
我在最后一行发现错误“[[:not found]”。另外,是否可以在将其分配给输出时显示输出? –
'[[''not found意味着你没有使用bash。确保在运行时使用'bash'。要显示输出,你可以在第一行之后加上'echo“$ out”'。 – anubhava
您可以使用
curl -I http://example.com/file.zip
,并检查Last-Modified:
值。
您也可以使用wget --timestamping
,但要求HEAD信息您有更多的控制权。
请勿使用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
它本质上是这样说,与增加了可读性更详细:
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个案例中设置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
校验,并与前值(存储在一个txt的地方) – Alfabravo
两个'curl'和'wget'可以说,如果没有改变不下载文件进行比较。请参阅http:// stackoverflow。com/q/32322456/258523获得关于'wget'的最新问题和回答。 –