如何检查外壳是否存在URL并可能卷曲?


79

我正在寻找一个简单的shell(+ curl)检查,如果URL存在(返回200),则检查结果为true或false。

Answers:


132

使用--fail将使失败请求的退出状态不为零。使用--head会避免下载文件内容,因为我们不需要此检查。使用--silent将避免支票本身发出状态或错误。

if curl --output /dev/null --silent --head --fail "$url"; then
  echo "URL exists: $url"
else
  echo "URL does not exist: $url"
fi

如果您的服务器拒绝HEAD请求,则可以选择仅请求文件的第一个字节:

if curl --output /dev/null --silent --fail -r 0-0 "$url"; then

4
包括-o /dev/null禁止将标头打印到stdout
Shawn Chin 2012年

3
添加--location跟随重定向并报告重定向到URL的存在,而不是原始URL
Ivan Kozik 2013年

1
即使使用-L或--location,此解决方案也不适用于案例302的临时重定位。例如:github.com/stedolan/jq/releases/download/jq-1.5/jq-1.5.tar.gz
Nam Nguyen

2
@NamNguyen,...妥善处理是一个有趣的问题-一种方法是-r 0-0仅请求文件的第一个字节。我已经适当修改了答案。
2015年

2
@NamNguyen我会还强烈建议return 0,并return 1为感实性和falsiness,而不是使用标准输出返回true,并false作为字符串。这样,某人可以运行:if existURL "$url",而没有试图捕获其标准输出并对其进行解释的额外(低效)开销。
查尔斯·达菲

34

我发现wget是比CURL更好的工具。记住的选项较少,您实际上可以在bash中检查其真实值,以查看默认情况下它是否成功。

if wget --spider http://google.com 2>/dev/null; then
  echo "File exists"
else
  echo "File does not exist"
fi

--spider选项使wget仅检查文件而不是下载文件,并使2> /dev/nullwget的stderr输出静音。


“可以用bash实际检查其真值”并不是wget独有的;使用--fail,可以对curl进行相同操作。
查尔斯·达菲

3
这就是为什么我说“默认”。尝试运行wget google.com/asdfcurl google.com/asdfcurl遇到404错误时,默认情况下返回EXIT_SUCCESS,而wget返回EXIT_FAILURE。
ailnlv

这真的很慢。我检查了一个网站,该网站上有要下载的文件总和为1GB,但我不想下载它们,只需检查目标是否存在
rubo77 '18

1
这就是该--spider参数的目的:它wget在检查文件的存在之后(而不是下载)来使返回。
ailnlv '18

我在github上有一个问题:wget --spidergithub.com/linuxwacom/libwacom/releases/download/libwacom-1.6/…导致 403 FORBIDDEN,消息“远程文件不存在-链接断开!” ”。我需要脚本来检查远程URL是否存在,以自动更新程序。(有趣的是,没有--spider标志,wget只是下载文件而没有问题。这很奇怪...)
shevy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.