我偶然发现这个网站哪讲到这个。
那么,当通过获取 gzip 压缩版本下载整个网站时,正确的命令是什么?
我已经测试了这个命令,但我不知道 wget 是否真的获得了 gzipped 版本:
wget --header="accept-encoding: gzip" -m -Dlinux.about.com -r -q -R gif,png,jpg,jpeg,GIF,PNG,JPG,JPEG,js,rss,xml,feed,.tar.gz,.zip,rar,.rar,.php,.txt -t 1 http://linux.about.com/
答案1
如果您请求经过 gzip 处理的内容(使用 Accept-encoding: gzip 标头,这是正确的),那么我的理解是 wget 无法读取该内容。因此,您最终会在磁盘上得到一个单一的 gzip 压缩文件,用于您点击的第一页,但没有其他内容。
即,您不能使用 wget 请求 gzip 压缩内容并同时递归整个站点。
我认为有一个补丁可以让 wget 支持此功能,但它不在默认发行版中。
如果包含 -S 标志,您可以判断 Web 服务器是否以正确类型的内容进行响应。例如,
wget -S --header="accept-encoding: gzip" wordpress.com
--2011-06-17 16:06:46-- http://wordpress.com/
Resolving wordpress.com (wordpress.com)... 72.233.104.124, 74.200.247.60, 76.74.254.126
Connecting to wordpress.com (wordpress.com)|72.233.104.124|:80... connected.
HTTP request sent, awaiting response...
HTTP/1.1 200 OK
Server: nginx
Date: Fri, 17 Jun 2011 15:06:47 GMT
Content-Type: text/html; charset=UTF-8
Connection: close
Vary: Accept-Encoding
Last-Modified: Fri, 17 Jun 2011 15:04:57 +0000
Cache-Control: max-age=190, must-revalidate
Vary: Cookie
X-hacker: If you're reading this, you should visit automattic.com/jobs and apply to join the fun, mention this header.
X-Pingback: http://wordpress.com/xmlrpc.php
Link: <http://wp.me/1>; rel=shortlink
X-nananana: Batcache
Content-Encoding: gzip
Length: unspecified [text/html]
内容编码明确指出 gzip,但是对于 linux.about.com(当前),
wget -S --header="accept-encoding: gzip" linux.about.com
--2011-06-17 16:12:55-- http://linux.about.com/
Resolving linux.about.com (linux.about.com)... 207.241.148.80
Connecting to linux.about.com (linux.about.com)|207.241.148.80|:80... connected.
HTTP request sent, awaiting response...
HTTP/1.1 200 OK
Date: Fri, 17 Jun 2011 15:12:56 GMT
Server: Apache
Set-Cookie: TMog=B6HFCs2H20kA1I4N; domain=.about.com; path=/; expires=Sat, 22-Sep-12 14:19:35 GMT
Set-Cookie: Mint=B6HFCs2H20kA1I4N; domain=.about.com; path=/
Set-Cookie: zBT=1; domain=.about.com; path=/
Vary: *
PRAGMA: no-cache
P3P: CP="IDC DSP COR DEVa TAIa OUR BUS UNI"
Cache-Control: max-age=-3600
Expires: Fri, 17 Jun 2011 14:12:56 GMT
Connection: close
Content-Type: text/html
Length: unspecified [text/html]
它返回 text/html。
由于一些较旧的浏览器仍然存在 gzip 编码内容的问题,因此许多网站仅根据浏览器识别来启用它。他们经常默认将其关闭,只有当他们知道浏览器可以支持它时才将其打开 - 并且他们通常不将 wget 包含在该列表中。这意味着您可能会发现 wget 永远不会返回 gzip 内容,即使该网站似乎对您的浏览器这样做。
答案2
获取 html 页面并压缩它或获取任何文件并压缩的简单命令。
$ wget -qO - <url> | gzip -c > file_name.gz
有关该选项的更多信息。使用 man 命令。
答案3
根据 mikeserv 等人的说法。在上面对 bash(大约版本 4.3)的响应中,其开发人员曾经采用了关于如何维护 LINENO 的 IEEE 规范,以便在评估 EXIT 信号的参数时该值始终设置为 1。 (事实上,它是当前行,也是这些执行上下文中的第一行。)
已经列出了多种解决方法。因为我觉得它与其他任何东西相比都非常简单 - 让我们在这里提供我对这个问题的概念证明:
#!/bin/bash
trap 'catch EXIT $? $debug_line_old' EXIT
trap 'debug_line_old=$debug_line;debug_line=$LINENO' DEBUG # note: debug is invoked before line gets executed!
catch() {
echo "event=$1, rc=$2, line=$3, file=$0"
}
exit 1
当运行结果时你应该看到这个:
event=EXIT, rc=1, line=7, file=./trap_exit_get_lineno.bash
顺便说一句 - 当不将任何类型的陷阱事件破坏成一行时,它是有益的 - 为单独的信号保留单独的行对编码有很大帮助。其次,DEBUG 陷阱在调用其他任何内容方面似乎受到很大限制。