2015-09-14 193 views
0

基本上在网页上有一个目录列表,每个目录都有更多的子目录。子目录包含许多文件,我想从我的Linux机器上的一个位置下载一个文件,每个子文件夹中都有特定的序列号'RMD'。wget:下载目录/子目录中的所有文件

例如,说主目录链接到目录dir1,dir2,dir3 ...,并且每个目录都有子目录dir1a,dir1b ...,dir2a,dir2b ...等。我想要下载形式:

webpage/dir1/dir1a/file321RMD210 
webpage/dir1/dir1b/file951RMD339 
... 
webpage/dir2/dir2a/file416RMD712 
webpage/dir2/dir2b/file712RMD521 

目录/子目录未按顺序在上面的例子中编号一样(这只是我使它更易于阅读),那么有没有一个终端命令,将递归遍历每个目录和子目录,并下载每个文件的文件名中都带有字母'RMD'?

该网站的问题是:here

我希望这是足够的信息。

+0

是有一个目录列表在网站上?或者它只是文件夹中的文件?如果没有公开列表,则无法知道存在哪些文件。如果有文件列表,你需要做一些事情来获取这个列表,提取每个网址,访问它们,提取每个网址......等等。你肯定有一些工具可以在网上找到从某个网址抓取网站可能会这样做,但我无法命名或推荐任何。 –

+0

我已经添加了主帖的网站链接。我可以手动转到每个目录/子目录并下载每个文件,但这需要很长时间。另外,知道如何自动为将来做这件事会很有用。 –

回答

2

我注意到这个网站支持FTP协议,这是一种更方便的阅读文件和文件夹的方式。 (它用于传输文件,而不是网页)

获得一个FTP客户端(大量的),并打开ftp://atmos.nmsu.edu/PDS/data/mslrem_1001/DATA/,你可能只是突出显示那里的所有文件夹,并点击下载。

1

有很多言论的一个答案:

万一网站支持FTP,你最好使用@MichaelBaldry's answer。这个答案旨在给出一个方法来做到这一点wget(但对服务器和客户端来说效率较低)。

只有在情况下,网站可与一个目录列表,则可以使用-r标志这(在-R标志的目的是找到网页中的链接,然后下载这些网页为好)。

下面的方法是低效服务器和客户端并可能导致巨大的负荷,如果网页是动态生成的。您还提到的网站明确要求不要以这种方式获取数据

wget -e robots=off -r -k -nv -nH -l inf -R jpg,jpeg,gif,png,tif --reject-regex '(.*)\?(.*)' --no-parent 'http://atmos.nmsu.edu/PDS/data/mslrem_1001/DATA/' 

有:

  • wget你要调用的程序;
  • -e robots=off;您忽略网站请求不会自动下载的事实;
  • -r:你递归下载;
  • -R jpg,jpeg,gif,png,tif:拒绝下载媒体(小图片);
  • --reject-regex '(.*)\?(.*)'请勿关注或下载查询页面(对索引页进行排序)。
  • -l inf:您保留下载的无限级
  • --no-parent:防止wget从开始获取的网站(例如在..链接到父目录)的父链接。


wget下载文件广度优先所以你将不得不等待很长一段时间它最终开始取真实的数据文件之前。


注意wget有没有办法猜测在服务器端的目录结构。它只是旨在找到提取的页面中的链接,因此这些知识旨在生成“可见”文件的转储。网络服务器可能没有列出所有可用的文件,因此wget将无法​​下载所有文件。

1

一种解决方案使用saxon-lint

saxon-lint --html --xpath 'string-join(//a/@href, "^M")' http://atmos.nmsu.edu/PDS/data/mslrem_1001/DATA/ | awk '/SOL/{print "http://atmos.nmsu.edu/PDS/data/mslrem_1001/DATA/"$0}' | while read url; do saxon-lint --html --xpath 'string-join(//a/@href, "^M")' "$url" | awk -vurl="$url" '/SOL/{print url$0}'; done | while read url2; do saxon-lint --html --xpath 'string-join(//a/@href, "^M")' "$url2" | awk -vurl2="$url2" '/RME/{print url2$0}'; done | xargs wget 

编辑

"^M" 

通过控制 + 中号(UNIX)或\r\n窗户

相关问题