从 http 目录递归获取所有文件名(非内容)

sea*_*avi 9 https wget

一个大型生物研究项目选择通过 https 提供其档案:

https://tcga-data.nci.nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/tumor/

不幸的是,这些目录的内容似乎没有清单,所以我只想构建一个。我想获取整个目录树的文件名。有没有关于如何做到这一点的建议?我可以在 perl/python/R/etc 中写一些东西。以递归方式抓取 index.html 文件,但我认为 wget 可能有一些咒语可以让我获得文件名,但我还没有找到。

zb2*_*226 5

与 FTP 协议相反,HTTP 不知道目录列表的概念。因此,wget只能寻找链接并根据用户定义的某些规则遵循它们。

话虽如此,如果您绝对需要,您可以滥用wget调试模式来收集在分析 HTML 页面时遇到的链接列表。它确实不美丽,但这里是:

wget -d -r -np -N --spider -e robots=off --no-check-certificate \
  https://tcga-data.nci.nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/tumor/ \
  2>&1 | grep " -> " | grep -Ev "\/\?C=" | sed "s/.* -> //"
Run Code Online (Sandbox Code Playgroud)

一些旁注:

  • 这将生成一个仍包含(目录)重复项的列表,因此您需要将输出重定向到文件并用于uniq修剪列表。
  • --spider导致wget不下载任何内容,但它仍然会对它认为要排队的每个文件执行 HTTP HEAD 请求。这将导致比实际需要/预期更多的流量,并导致整个过程非常慢。
  • -e robots=off需要忽略robots.txt可能导致wget无法开始搜索的文件(您在问题中给出的服务器就是这种情况)。
  • 如果您有wget1.14 或更高版本,您可以使用它--reject-regex="\?C="来减少不必要的请求数量(对于 @slm 已经提到的那些“排序依据”链接)。这也消除了后续步骤的需要grep -Ev "\/\?C="


小智 5

我实际上遇到了完全相同的问题。这两种解决方案对我都不起作用。然而,这确实:

安装lftp,然后做

lftp https://tcga-data.nci.nih.gov/tcgafiles/ftp_auth/distro_ftpusers/anonymous/tumor/
du -a > manifest.txt
Run Code Online (Sandbox Code Playgroud)

这会给你所有的目录和文件名。