关于shell:使用wget以递归方式获取包含任意文件的目录

Using wget to recursively fetch a directory with arbitrary files in it

我有一个Web目录,在其中存储一些配置文件。我想使用wget将这些文件拉下来并维护它们的当前结构。例如,远程目录如下:

1
http://mysite.com/configs/.vim/

.vim保存多个文件和目录。我想使用wget在客户机上复制它。似乎找不到正确的wget标志组合来完成此操作。有什么想法吗?


你必须把-np/--no-parent选项传给wget(当然,除了-r/--recursive选项外),否则它会跟随我站点目录索引中的链接进入父目录。所以命令如下:

1
wget --recursive --no-parent http://example.com/configs/.vim/

为避免下载自动生成的index.html文件,请使用-r/--reject选项:

1
wget -r -np -R"index.html*" http://example.com/configs/.vim/


要以递归方式下载一个目录,该目录拒绝index.html*文件,并且不下载主机名、父目录和整个目录结构,请执行以下操作:

1
wget -r -nH --cut-dirs=2 --no-parent --reject="index.html*" http://mysite.com/dir1/dir2/data


对于其他有类似问题的人。wget遵循robots.txt,这可能不允许你抢占网站。不用担心,你可以关掉它:

1
wget -e robots=off http://www.example.com/

http://www.gnu.org/software/wget/manual/html_node/robot-exclusion.html


您应该使用-m(mirror)标志,因为它注意不要弄乱时间戳并无限期地重复出现。

1
wget -m http://example.com/configs/.vim/

如果您在这个线程中添加其他人提到的点,它将是:

1
wget -m -e robots=off --no-parent http://example.com/configs/.vim/

下面是完整的wget命令,我可以从服务器目录下载文件(忽略robots.txt)。

1
wget -e robots=off --cut-dirs=3 --user-agent=Mozilla/5.0 --reject="index.html*" --no-parent --recursive --relative --level=1 --no-directories http://www.example.com/archive/example/5.3.0/

如果--no-parent没有帮助,您可以使用--include选项。

目录结构:

1
2
http://<host>/downloads/good
http://<host>/downloads/bad

您想下载downloads/good而不是downloads/bad目录:

1
wget --include downloads/good --mirror --execute robots=off --no-host-directories --cut-dirs=1 --reject="index.html*" --continue http://<host>/downloads/good


1
wget -r http://mysite.com/configs/.vim/

为我工作。

也许你有一个干扰它的.wgetrc?


要使用用户名和密码递归获取目录,请使用以下命令:

1
wget -r --user=(put username here) --password='(put password here)' --no-parent http://example.com/

您只需要两个标志,一个是用于递归的"-r",另一个是"--no-parent"(或-np),以便不进入'.'".."。这样地:

wget -r --no-parent http://example.com/configs/.vim/

就是这样。它将下载到以下本地树:./example.com/configs/.vim。但是,如果不需要前两个目录,则使用前面回复中建议的附加标志--cut-dirs=2

wget -r --no-parent --cut-dirs=2 http://example.com/configs/.vim/

它只会把你的文件树下载到./.vim/中。

事实上,我从这个答案中得到的第一行恰好来自wget手册,在第4.3节的结尾处有一个非常干净的例子。


此版本以递归方式下载,不创建父目录。

1
2
3
4
5
wgetod() {
    NSLASH="$(echo"$1" | perl -pe 's|.*://[^/]+(.*?)/?$|\1|' | grep -o / | wc -l)"
    NCUT=$((NSLASH > 0 ? NSLASH-1 : 0))
    wget -r -nH --user-agent=Mozilla/5.0 --cut-dirs=$NCUT --no-parent --reject="index.html*""$1"
}

用途:

  • 添加到~/.bashrc或粘贴到终端
  • wgetod"http://example.com/x/"

  • wget 1.18可能工作得更好,例如,我被版本1.12的bug咬了,其中…

    1
    wget --recursive (...)

    …只检索index.html而不是所有文件。

    解决方法是注意到一些301重定向,并尝试新的位置-考虑到新的URL,wget得到了目录中的所有文件。


    您应该能够通过添加a-r来完成它。

    1
    wget -r http://stackoverflow.com/