2017-02-13 1 views
0

私は、テキストファイル内のURLのリストを持っている:ダウンロード

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

私は私のファイルシステム上に同じツリーを複製することにより、これらのファイルをダウンロードしたいと思います。

は、リストの2番目の引数としてターゲットファイルを追加します:

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 

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

は、ここで私が試したものです。例えば、私は私が行っていたときに、次のツリーで終了したいと思います

はどこにこれらを保存するwgetを伝えるためにwhileループを使用します。

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

これはワットませんでしたork、最終結果は、新しいディレクトリなしで、同じディレクトリ内のすべてのファイルでした。あなたのファイルsite_media_list.txtを想定し

答えて

0

は(ディレクトリを対象としていない)ファイルだけのリストを含むされ、あなたは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

そのままディレクトリ構造を維持する作業ディレクトリに、リンクのみ(なしのパス)のリストを使用してファイルを作成し、それぞれ1行に1つ、そしてwget -nH -x -i links_list.txtファイルをダウンロードします。同じコマンドのより読みやすいバージョンを以下に示します。

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

Wgetには、多くの柔軟なディレクトリオプションがあります。詳細については、を参照してください。

関連する問題