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

时间:2008-11-07 21:44:27

标签: shell wget

我有一个web目录,我存储了一些配置文件。我想使用wget来拉下这些文件并保持它们当前的结构。例如,远程目录如下所示:

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

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

15 个答案:

答案 0 :(得分:874)

您必须将-np / --no-parent选项传递给wget(当然除-r / --recursive之外),否则会跟随我站点上的目录索引中的链接到父目录。所以命令看起来像这样:

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

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

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

答案 1 :(得分:115)

以递归方式下载目录,该目录拒绝index.html *文件和下载,而不包含主机名,父目录和整个目录结构:

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

答案 2 :(得分:110)

对于有类似问题的其他人。 Wget跟随robots.txt,可能不允许您抓取该网站。不用担心,你可以把它关掉:

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

http://www.gnu.org/software/wget/manual/html_node/Robot-Exclusion.html

答案 3 :(得分:35)

你应该使用-m(镜像)标志,因为它注意不要弄乱时间戳并无限地递归。

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

如果你在这个帖子中添加其他人提到的分数,那就是:

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

答案 4 :(得分:29)

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

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/

答案 5 :(得分:6)

如果--no-parent无效,您可以使用--include选项。

目录结构:

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

您要下载downloads/good但不要downloads/bad目录:

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

答案 6 :(得分:5)

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

适合我。

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

答案 7 :(得分:4)

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

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

答案 8 :(得分:2)

你只需要两个标志,一个是"-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 manual精确地得到了这个答案的第一行,他们在第4.3节末尾有一个非常干净的例子。

答案 9 :(得分:2)

在处理递归下载时,以下选项似乎是完美的组合:

wget -nd -np -P / dest / dir --recursive http://url/dir1/dir2

手册页中的相关摘要,为方便起见:

vich_uploader:
db_driver: orm

mappings:
    blog_picture:
        uri_prefix:         '%app.path.blog_pictures%'
        upload_destination: '%kernel.project_dir%/public%app.path.blog_pictures%'
        directory_namer:
            service: Vich\UploaderBundle\Naming\CurrentDateTimeDirectoryNamer
            options:
                date_time_format: 'Y/m/d'
                date_time_property: 'logoUploadDate'

答案 10 :(得分:2)

首先,感谢所有发布答案的人。这是我递归下载网站的“终极”wget 脚本:

wget --recursive ${comment# self-explanatory} \
  --no-parent ${comment# will not crawl links in folders above the base of the URL} \
  --convert-links ${comment# convert links with the domain name to relative and uncrawled to absolute} \
  --random-wait --wait 3 --no-http-keep-alive ${comment# do not get banned} \
  --no-host-directories ${comment# do not create folders with the domain name} \
  --execute robots=off --user-agent=Mozilla/5.0 ${comment# I AM A HUMAN!!!} \
  --level=inf  --accept '*' ${comment# do not limit to 5 levels or common file formats} \
  --reject="index.html*" ${comment# use this option if you need an exact mirror} \
  --cut-dirs=0 ${comment# replace 0 with the number of folders in the path, 0 for the whole domain} \
$URL

之后,可能需要从 main.css?crc=12324567 之类的 URL 中获取 stripping the query params 并运行本地服务器(例如,通过您刚刚编写的目录中的 python3 -m http.server)来运行 JS。请注意,--convert-links 选项仅在完整抓取完成后才会启动。

此外,如果您想访问一个可能很快就会关闭的网站,您应该get in touch with the ArchiveTeam并要求他们将您的网站添加到他们的 ArchiveBot 队列中。

答案 11 :(得分:1)

您应该只需添加-r

即可
wget -r http://stackoverflow.com/

答案 12 :(得分:1)

Wget 1.18可能会更好用,例如,我被版本1.12错误所困扰......

wget --recursive (...)

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

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

答案 13 :(得分:1)

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

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"
}

用法:

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

答案 14 :(得分:0)

递归wget忽略机器人(对于网站)

wget -e robots=off -r -np --page-requisites --convert-links 'http://example.com/folder/'

-e robots = off导致它忽略该域的robots.txt

-r使其递归

-np =没有父母,因此它不会跟踪到父文件夹的链接