问题是这样的,我有一个包含 URL 列表的文件,例如links.txt
:
http://www.tipsfor.us/wp-content/uploads/2009/01/vim-editor-icon.png http://wp.psyx.us/wp-content/uploads/2011/01/vi-vim-tutorial-1.gif http://proft.me/static/img/vim/vi-vim-cheat-sheet.gif
我想要做的是让wget
大家知道我不希望事情变成png
这样:
$ wget -R png -i 链接.txt
但这没有效果,wget
仍然会获取png
文件和其他文件。管道传输links.txt
不是grep
一种选择,因为在实际文件中,链接是这种形式http://example.com/get/123987562
,然后被解析/重定向到类似http://example.com/media/images/cool-pic.jpg
所以问题是,我如何使用来拒绝/排除某些文件wget
?
答案1
Wget,或者至少我所用的版本似乎不太适合做这件事,选项--server-response
似乎仍然会下载文件。如果 wget 不是必需的,那么 curl 可能是更好的选择。
解决此类问题的方法包括查看服务器返回的 Content-Type。例如:
curl -I http://www.tipsfor.us/wp-content/uploads/2009/01/vim-editor-icon.png
在 stdout 上写入类似以下内容
http://www.tipsfor.us/wp-content/uploads/2009/01/vim-editor-icon.png
HTTP/1.1 200 OK
Server: nginx admin
Date: Thu, 03 Nov 2011 09:22:55 GMT
Content-Type: image/png
Content-Length: 35765
Last-Modified: Wed, 13 Apr 2011 05:19:19 GMT
Connection: keep-alive
Vary: Accept-Encoding
Expires: Thu, 10 Nov 2011 09:22:55 GMT
Cache-Control: max-age=604800
X-Cache: HIT from Backend
Accept-Ranges: bytes
使用 grep 过滤结果允许您测试可接受的 mime 类型。然后,您可以推广该方法以检查文件列表的有效 mime 类型。整理它并将其放入 shell 脚本中:
#!/bin/bash
# in mimechecker.sh
LINKFILE=$1
PATTERN=$2
function mimefilter {
URL=$1
PATTERN=$2
curl -sI $URL | egrep ${PATTERN} > /dev/null 2>&1
if [ "$?" -eq "0" ] ; then
wget $URL
fi
}
(
while read line
do
mimefilter $line $PATTERN
done
) < $LINKFILE
你可以这样调用:
mimechecker links.txt 'image/png'