从URL列表下载并输出到相关目录

时间:2017-02-13 15:05:08

标签: bash wget

我在文本文件中有一个URL列表:

http://host/index.html
http://host/js/test.js
http://host/js/sub/test_sub.js
http://host/css/test.css

我想通过在我的文件系统上复制相同的树来下载这些文件。例如,我想在完成后以下面的树结束:

wd/
 |_index.html
 |_js/
 |  |_test.js
 |  |_sub/
 |     |_test_sub.js/
 |_css/
    |_test.css

这是我尝试过的:

在列表中添加目标文件作为第二个参数:

http://host/index.html 
http://host/js/test.js js/test.js
http://host/js/sub/test_sub.js js/sub/test_sub.js
http://host/css/test.css css/test.css

使用while循环告诉wget保存这些内容:

 while read url target; do
   wget "$url" -P "$target";
 done < site_media_list.txt 

这不起作用,最终结果是同一目录中的所有文件,没有新目录。

3 个答案:

答案 0 :(得分:3)

创建一个只包含链接列表(没有路径)的文件,每行一个,然后wget -nH -x -i links_list.txt将文件下载到工作目录,保持目录结构不变。下面给出了同一命令的更易读的版本。

wget --no-host-directories --force-directories --input-file=links_list.txt

Wget有许多灵活的目录选项。查看man wget directory options了解更多信息。

答案 1 :(得分:0)

假设您的文件site_media_list.txt仅包含文件列表(而不是目标目录),您应该能够从URL中解析出目录名称:

while read -r url ; do
  s=$(echo "$url" | sed -E 's#http://host/(.*/)?.*$#\1#')
  if [[ -z "$s" ]]; then
    echo "working dir"
    wget "$url"
  else
    echo "subdir"
    mkdir -p "$s"
    wget $url -P "$s"
  fi
done < site_media_list.txt

看起来您遇到的主要问题是您将目录名称​​和文件名传递给wget - 您只需要传递目录名称 - wget将从URL计算文件名。

答案 2 :(得分:0)

/上的路径拆分为数组,仅使用相关元素创建路径。

#!/bin/bash
while read url ; do
    IFS=/ parts=($url)
    if (( ${#parts[@]} > 4 )) ; then
        IFS=/ path="${parts[*]:3:${#parts[@]}-4}"
        mdkir -p "$path"
    fi
    IFS=/ wget -O "${parts[*]:3}" "$url"
done