5

我有适用于 windows 和 linux 的GNU Wget 1.10.2并且-k选项在这两者上的行为不同。

-k, --convert-links 使下载的 HTML 中的链接指向本地文件。

在 Windows 上它产生:

www.example.com/index.html
www.example.com/index.html@page=about
www.example.com/index.html@page=contact
www.example.com/index.html@page=sitemap

在linux上它产生:

www.example.com/index.html
www.example.com/index.html?page=about
www.example.com/index.html?page=contact
www.example.com/index.html?page=sitemap

这在 linux 中是有问题的,因为当我通过 Apache 提供镜像时,它不会区分 4 个生成的页面,因为问号 ( ? ) 字符之后的部分用作文件的查询字符串。

关于如何控制它的任何想法?

谢谢

4

4 回答 4

13

您不能在 NTFS 或 FAT32 的文件名中使用问号 (?)。这就是 wget 使用 at 符号 (@) 的原因。

在 Linux 中,大多数文件系统只禁止使用斜杠 (/),因此 wget 使用问号(因为它是 URI 的一部分)。

您可以使用--restrict-file-names=unix或强制执行任一行为--restrict-file-names=windows

从 wget 文档:

当模式设置为“unix”时,Wget 会转义字符 '/' 和 0-31 和 128-159 范围内的控制字符。这是类 Unix 操作系统的默认设置。

当模式设置为“windows”时,Wget 会转义字符'\'、'|'、'/'、':'、'?'、'"'、'*'、'<'、'>'、以及控制字符在 0-31 和 128-159 范围内。除此之外,Windows 模式下的 Wget 使用 '+' 代替 ':' 来分隔本地文件名中的主机和端口,并使用 '@' 代替“?” 将文件名的查询部分与其余部分分开。因此,在 Unix 模式下将保存为 '<code>www.xemacs.org:4300/search.pl?input=blah' 的 URL 将保存为 ' <code>www.xemacs.org+4300/search.pl@input=blah' 在 Windows 模式下。此模式是 Windows 上的默认模式。

于 2009-03-10T12:01:29.860 回答
4

这在 linux 中是有问题的,因为当我通过 Apache 提供镜像时,它不会区分 4 个生成的页面,因为问号 (?) 字符之后的部分用作文件的查询字符串。

要在 URL 路径部分中包含问号,您可以对其进行转义:

www.example.com/index.html%3Fpage=about

--convert-links 应该为你做这个,我想——如果不是,可能是一个错误。

于 2009-03-10T15:06:42.457 回答
3

--restrict-file-names=windows

于 2009-03-10T12:08:10.203 回答
1

这在 linux 中是有问题的,因为当我通过 Apache 提供镜像时,它不会区分 4 个生成的页面,因为问号 (?) 字符之后的部分用作文件的查询字符串。

如果已经太晚了,这个 sed 命令帮助了我:

find . -type f -name "*html*" -exec sed -i -r 's/(src|href)=(["\x27])(.*?)(\?)(.*?)\2/\1=\2\3%3F\5\2/g' {} + 

它取代 ? 在带有 %3F 的 href= 或 src= 标记中。(\x27 是单个刻度)

于 2017-06-09T14:48:07.883 回答