2017-02-13 85 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有很多靈活的目錄選項。查看了解更多信息。