使用wget镜像具有相同名称的路径和子文件夹的网站

5
我正在尝试制作一个网站的镜像,但URL包含多个路径,当以正常的wget方式将其复制到磁盘文件中时,这些路径会重叠。问题表现为URLs如http://example.com/newshttp://example.com/news/article1wget将这些URLs下载为/news/news/article1,但这意味着同名的文件将被同名的文件夹覆盖。
一个正确的静态镜像需要将这两个URLs下载为/news/index.html/news/article1
我尝试通过运行wget两次并相应地移动文件来解决此问题,但对我来说效果不佳。 /news路径链接到需要转换的/news/article1。我使用-k选项转换链接,但如果我运行wget两次,则不会在这些不相关的下载文件之间转换链接。
以下是我的命令:
wget -p -r -l4 -k -d -nH http://example.com

这是我尝试过的一个解决方法的示例:

以下是我尝试过的解决方法:

# wget once at first level (gets /news path but not /news/*)
wget -p -r -l1 -k -nH http://example.com

# move /news file to temp path
mv news /tmp/news.html

# wget again to get everything else (notice the different level value)
wget -p -r -l4 -k -nH http://example.com

# move temp path back to /news/index.html
mv /tmp/news.html news/index.html

在上面的示例中,指向/news/article1的链接在/news页面上未被转换。有人知道如何使用wget解决这个问题吗?是否有其他工具可以更好地解决这个问题?

1
我猜 (大多数) Linux 文件系统无论如何都不允许文件和目录使用相同的名称。那么,重命名文件以使其与目录区分开来是否被允许? - Willem Van Onsem
@CommuSoft,是的!wget可以重命名HTML文件并添加.html扩展名。感谢您的帮助! - dayer4b
2个回答

4

我明白了!

问题在于我假设/news/index.html是我需要的URL。经过仔细阅读man页面,我发现-E (--adjust-extension)可以解决我的问题。该标志强制wget.html扩展名应用于其下载的所有HTML文件。

加上-k以转换链接,就可以得到一个100%可用的镜像,其中包含所有所需的页面。

这是已下载文件和路径的示例地图:

http://example.com/news           -->  /news.html
http://example.com/news/article1  -->  /news/article1.html

作为一个功能镜像,这很棒。默认的Web服务器配置(至少对于Apache)似乎允许路径http://sitemirror.com/news/article1加载/news/article1.html内容。然而,可能需要进行重写,以避免http:/sitemirror.com/news路径显示404或文件夹索引。这应该不难。
哦,这是我的最终wget命令:
wget -p -r -l4 -E -k -nH http://example.com

0

假设您想使用wget镜像整个网站,并保留原始网站的命名方案。也就是说,不要通过添加.html扩展名来重命名文件。

如果文件和目录冲突,则会出现问题。当创建目录时,文件将被覆盖。

这个解决方案怎么样:

  1. 使用wget --mirror镜像网站
  2. 然后,作为第二步,返回并下载有问题的文件。(不是所有文件。)因此,如果有一个wiki/目录有一个主页,现在应该保存为“wiki/index.html”而不是普通的“wiki/”,只下载那一页。

下面的脚本在文件/目录名称重叠时生成index.html文件。

#!/bin/bash

function processdir() {
    website="https://www.example.com"
    echo "The dir name is $1";
    if [ -e $1/index.html ]; then
        echo "$1/index.html already exists"
    else
        echo "Downloading $website/$1 to $1/index.html"
        rm /tmp/index.html
        wget --quiet -O /tmp/index.html $website/$1
        if [ "$?" = "0" ]; then
            echo "Download succeed. Copying file into place."
            echo "cp /tmp/index.html $1/index.html"
            cp /tmp/index.html $1/index.html
        else
            echo "Download failed."
        fi
        ls -al $1/index.html
    fi
}
export -f processdir
find . -type d -name '*' -exec /bin/bash -c 'processdir "$0"' {} \;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接