我一直在使用以下Unix bash脚本:
#!/bin/bash
mkdir -p ~/Desktop/URLs
n=1
while read mp3; do
curl "$mp3" > ~/Desktop/URLs/$n.mp3
((n++))
done < ~/Desktop/URLs.txt
从“URLs.txt”中列出的网址下载并重命名一堆mp3文件。它运行良好(感谢StackOverflow用户),但由于可疑的服务器数量/时间下载限制,它只允许我从我的URL列表中访问40-50个文件的范围。
有没有办法通过在while循环中添加“timer”来解决这个问题,所以每个“X”秒下载1个文件?
我在这里找到了另一个相关的问题:
How to include a timer in Bash Scripting?
但是我不确定在哪里添加“睡眠[秒数]”......或者即使“睡眠”真的是我的脚本需要...?
任何帮助都非常感激 - 一如既往。
戴夫
答案 0 :(得分:1)
curl
有一些非常棒的命令行选项(documentation),例如,--limit-rate
将限制curl使用的带宽量,这可能会完全解决您的问题。< / p>
例如,将curl行替换为:
curl --limit-rate 200K "$mp3" > ~/Desktop/URLs/$n.mp3
会将传输限制为平均每秒200K,这会在25秒内下载一个典型的5MB MP3文件,您可以尝试不同的值,直到找到最大速度。
您还可以尝试--retry
和--retry-delay
的组合,以便在下载失败时,curl
等待,然后在一定时间后再次尝试。
例如,将curl行替换为:
curl --retry 30 "$mp3" > ~/Desktop/URLs/$n.mp3
这将传输文件。如果传输失败,它将等待一秒钟并再次尝试。如果它再次失败,它将等待两秒钟。如果它再次失败,它将等待四秒钟,依此类推,将等待时间加倍,直至成功。 “30”表示它将重试最多30次,并且永远不会等待超过10分钟。您可以在我提供的文档链接中了解这一切。
答案 1 :(得分:0)
#!/bin/bash
mkdir -p ~/Desktop/URLs
n=1
while read mp3; do
curl "$mp3" > ~/Desktop/URLs/$n.mp3 &
((n++))
if ! ((n % 4)); then
wait
sleep 5
fi
done < ~/Desktop/URLs.txt
这将产生最多4个curl
个实例,然后在它再生成4个之前等待它们完成。
答案 2 :(得分:0)
与优化不同的是答案。如果您可以始终获得前几个URL,但是它会在后面的URL上超时,那么您可以在成功接收到mp3时修剪您的URL文件吗?
也就是说,当1.mp3成功下载后,将其从列表中删除:
tail url.txt -n +2 > url2.txt; mv -f url2.txt url.txt
然后下次脚本运行时,它将从2.mp3开始
如果可以,你可以设置一个cron作业,一次又一次地定期执行脚本,一次咬一口。
祝你好运! 编辑:我刚刚想到你以编程方式对mp3进行编号,并且curl可能会在重启时破坏其中一些,因为每次运行它都会再次开始计数1.mp3。如果你走这条路,需要注意的事情。答案 3 :(得分:0)
计时器?
喜欢你的crontab?
man cron
您知道他们允许您下载的内容,只需计算您获得的文件的磁盘使用情况。
您可以转让。你需要它,你需要你的脚本的PID。
ps aux | grep $progname | print awk '{print $1}'
或类似的东西。这里的秘诀是你可以暂停
kill -SIGSTOP PID
并以
继续kill -SIGCONT PID
所以一般方法是
数组或队列上的网址或其他内容 bash让你拥有
处理网址。
增量转移计数器
转移计数器何时关闭
kill -SIGSTOP MYPID
您被停职。
会在一分钟/小时/天之后显示你的脚本
继续处理
重复完成。
只是不要退出,或者你需要重新做一遍,不过如果你使用perl它将是微不足道的。
免责声明,我不确定这是否是bash或其他什么的练习,我自由地承认我在perl中看到答案,这总是我在REPL之外的选择。 Bash中的代码足够长,或天堂禁止,Zsh(我的shell)你会明白为什么Perl如此受欢迎。啊回忆......
免责声明2:未经测试,驱动器,垃圾方法只能在这里实现,因为您已经知道转移可能是什么。显然,如果你有ssh,请使用ssh -D PORT you @ host并将mp3从代理中拉出一半。
在我自己的辩护中,如果你慢慢拉动你的网址,你会连接一段时间。也许“他们”可能会注意到这一点。暂停和恢复,你只能在抓住轨道时连接,否则就会连接。