
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リストをダウンロードして返されたデータを正しいローカルファイルに保存するにはどうすればよいですか?
答え1
デフォルトでは、wgetは渡されたURLの最後のコンポーネント名を持つファイルを作成します。多くのサーバーは、URLをhttp://www.url1.com/app?q=123&gibb=erish&gar=ble
きれいなファイル名を持つファイルにリダイレクトします(たとえば、http://download.url1.com/files/something.pdf
.wgetにリダイレクトURLの名前を使用するように指示できます(something.pdf
例:現在のディレクトリには予測できないファイル名がありますが、サーバーを信頼するか、などのディレクトリで作業している場合は、通常、正しい選択)。app?q=123&gibb=erish&gar=ble
--trust-server-names
--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
すべてのダウンロードが成功すると、この変数には0が含まれ、それ以外の場合は1が含まれます。このスニペットを関数に入れるか、このスニペットを文字列に入れるのは大丈夫ですerr
。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
答え2
次のように繰り返すことができますlist_of_urls
。
while read -r url; do
wget -O foo $url
done < list_of_urls
foo
各項目を決定するには、独自の方法を追加する必要がありますlist_of_urls
(これもディスク上のファイルであると仮定します)。
答え3
wget
オプションを直接使用できます。
wget -r -i list_of_urls