我想一一下载几千个文件。每个的平均大小为 5-10Mb。每个都有一个名称“name_{i}”,其中“i”是一个计数器。最简单和最好的方法是什么?
请注意,互联网连接可能会中断,我想中断该过程并稍后继续。在这些情况下,下次我运行脚本或发生任何情况时,它应该获取上次下载的文件,并在需要时重新下载它。
答案1
我相信你可以编写一个小的 shell 脚本来完成你想要的事情。使用 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}"
- 我不确定这是否意味着文件名中包含 {} 大括号。如果没有,只需从上面的行中删除\{
and即可。\}
wget
如果文件名有零填充的数字(例如 0005 而不仅仅是 5),您可以使用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