何千ものファイルを一つずつダウンロードしたいです。それぞれの平均サイズは5〜10Mbです。それぞれに「name_{i}」という名前があります。ここで「i」はカウンタです。最も簡単で良い方法は何ですか?
インターネット接続が中断される可能性があるため、このプロセスを中止して後で続行したいと思います。このような場合は、次にスクリプトを実行するか、何が起こった場合は最後にダウンロードしたファイルをインポートし、必要に応じて再ダウンロードする必要があります。
答え1
私はあなたが望むことを達成するために小さなシェルスクリプトを書くことができると思います。 forループを使用してファイルを繰り返し、wgetなどを使用して現在のファイルをダウンロードし、中断後に場所を読み取ることができるファイルに書き込みます。
例:
if [ -f $FILE ] count=$(cat file) for i in {$COUNT ..5} do wget https://foo.bar/name_$i echo "$i" > $FILE done else for i in {1..5} do wget https://foo.bar/name_$i echo "$i" > $FILE done fi
これは基本的なアイデアに過ぎず、ちょっとしたバグがあるかもしれませんが、私の考えを理解すると思います。
答え2
BASE_URL='http://some.site.somewhere.com/some/path'
LASTFILE='./countfile'
last=1
[ -e "$LASTFILE" ] && last=$(cat "$LASTFILE")
for i in $(eval {$last..1000}) ; do
echo "$i" > "$LASTFILE"
wget -c "$BASE_URL/name_\{$i\}"
done
あなたはそう言ったEach has a name of "name_{i}"
。ファイル名に{}中括弧が含まれていることを意味するかどうかはわかりません。そうでない場合は、上記の行から削除してください\{
。\}
wget
ファイル名にゼロで埋められた数字がある場合(たとえば、5ではなく0005)、seq
代わりにeval {$last..1000}
次のように使用できます。
for i in $(seq -w $last 1000); do
...
done
答え3
オプションをlftp
見てください:mirror
ミラー[OPTS][ソース[対象]]
Mirror specified source directory to local target directory. If the target directory ends with a slash (except the root), the source base name is appended to target directory name. Source and/or target can be URLs pointing to directories.
バラよりhttp://lftp.yar.ru/lftp-man.htmlもっと学ぶ。
編集する
マニュアルから:
lftp は、複雑な FTP、HTTP、その他のホストへのその他の接続を可能にするファイル転送プログラムです。サイトが指定されている場合、lftpはそのサイトに接続し、そうでない場合はopenコマンドを使用して接続を確立する必要があります。
lftp can handle several file access methods - FTP, FTPS, HTTP, HTTPS, HFTP, FISH, SFTP and file (HTTPS and FTPS are only available when lftp is compiled with GNU TLS or OpenSSL library).
lftp
HTTP経由でファイルをインポートするために使用できます。努力する:
lftp -e "mirror -c" http://url