2017-02-13 123 views
0

我有网址在文本文件列表:下载到相关目录

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 

这并没有w^ork,最终的结果是所有文件都在同一个目录中,没有新的目录。

回答

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计算文件名。

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 
2

让只有链接(无路径),每行一个,然后wget -nH -x -i links_list.txt文件下载到工作目录保持目录结构完整的列表的文件。下面给出了相同命令的更可读版本。

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

Wget有很多灵活的目录选项。查看了解更多信息。