list_of_urls
は次のようになります。
http://www.url1.com/some.txt
http://www.url2.com/video.mp4
私はそれをどのように使うか知っています:
wget -i list_of_urls
しかし、もし私のlist_of_urls
にはこれがあり、PDFやビデオなどの適切なファイルをすべて返します。
http://www.url1.com/app?q=123&gibb=erish&gar=ble
http://www.url2.com/app?q=111&wha=tcha&mac=allit
単一のファイルでこれを行うことができます:
wget -O some.txt "http://www.url1.com/app?q=123&gibb=erish&gar=ble"
wget
を使用してURLのリストをダウンロードし、返されたデータを適切なローカルファイルに保存するにはどうすればよいですか?
デフォルトでは、wgetは、渡されたURLの最後のコンポーネントを名前とするファイルに書き込みます。多くのサーバーはhttp://www.url1.com/app?q=123&gibb=erish&gar=ble
のようなURLをhttp://download.url1.com/files/something.pdf
のような見栄えの良いファイル名で別のURLにリダイレクトします。 something.pdf
オプションを渡すことにより、app?q=123&gibb=erish&gar=ble
の代わりにリダイレクトされたURL(つまり--trust-server-names
)の名前を使用するようにwgetに指示できます。不注意に使用すると、現在のディレクトリにある予測できないファイル名が上書きされる可能性があるため、これはデフォルトのモードではありません。しかし、サーバーを信頼するか、他の貴重なファイルを含まないディレクトリで作業している場合は、通常、--trust-server-names
を使用するのが適切です。
一部のサーバーは、リダイレクトの代わりにContent-Disposition
ヘッダーを使用してファイル名を指定します。 --content-disposition
オプションを渡して、wgetがこのファイル名を使用できるようにします。
したがって:
wget --content-disposition --trust-server-names -i list_of_urls
それでも見栄えの良いファイル名が得られない場合は、独自のファイル名を指定することをお勧めします。次のような行を含むファイルがあるとします。
http://www.url1.com/app?q=123&gibb=erish&gar=ble foo.pdf
http://www.url2.com/app?q=111&wha=tcha&mac=allit bar.txt
URLまたはファイル名に空白文字がないと仮定して、wgetでファイルを指定したファイル名にダウンロードするには、次のようにします。
err=0
while read -r url filename tail; do
wget -O "$filename" "$url" || err=1
done <list_of_urls_and_file_names
すべてのダウンロードが成功した場合はerr
変数に0が含まれ、それ以外の場合は1が含まれます。このスニペットを関数に配置した場合はreturn $err
を、文字列に配置した場合はexit $err
を使用できます。
URL以外を指定したくない場合、およびサーバーからニース名を取得できない場合は、ファイルタイプを推測して、少なくとも意味のある拡張子を取得することができます。
err=0
n=1
while read -r url; do
if wget -O tmpfile "$url"; then
ext=data
case $(file -i tmpfile) in
application/pdf) ext=pdf;;
image/jpeg) ext=jpg;;
text/html) ext=html;;
text/*) ext=txt;;
esac
mv tmpfile "$n.$ext"
else
err=1
fi
n=$((n+1))
done
必要に応じて他のタイプを追加します。 file
コマンドに-m
オプションがない場合は、省略して、必要なファイルタイプについてシステムでfile
が返すものを確認します。システムにファイル/etc/mime.types
がある場合、独自のリストを提供する代わりに、MIMEタイプと拡張子の関連付けを読み取ることができます。
n=1
while read -r url; do
if wget -O tmpfile "$url"; then
mime_type=$(file -m tmpfile)
ext=$(awk "$1 == \"$mime_type\" {print \$2; exit} END {print \"data\"}" /etc/mime.types)
mv tmpfile "$n.$ext"
else
err=1
fi
n=$((n+1))
done
list_of_urls
のエントリをループすることができます。このようなもの:
while read -r url; do
wget -O foo $url
done < list_of_urls
list_of_urls
の各エントリに対してfoo
を決定する独自の方法を追加する必要があることに注意してください(また、これはディスク上のファイルであると想定しています)。
wget
オプションを直接使用できます:
wget -r -i list_of_urls