需要帮助Unix bash“计时器”的mp3 URL下载脚本

时间:2010-12-10 03:47:59

标签: bash unix timer download mp3

我一直在使用以下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?

但是我不确定在哪里添加“睡眠[秒数]”......或者即使“睡眠”真的是我的脚本需要...?

任何帮助都非常感激 - 一如既往。

戴夫

4 个答案:

答案 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

  • 您被停职。

  • 无论

    ,你的crontab中的
  • 会在一分钟/小时/天之后显示你的脚本

  • 继续处理

  • 重复完成。

只是不要退出,或者你需要重新做一遍,不过如果你使用perl它将是微不足道的。

免责声明,我不确定这是否是bash或其他什么的练习,我自由地承认我在perl中看到答案,这总是我在REPL之外的选择。 Bash中的代码足够长,或天堂禁止,Zsh(我的shell)你会明白为什么Perl如此受欢迎。啊回忆......

免责声明2:未经测试,驱动器,垃圾方法只能在这里实现,因为您已经知道转移可能是什么。显然,如果你有ssh,请使用ssh -D PORT you @ host并将mp3从代理中拉出一半。

在我自己的辩护中,如果你慢慢拉动你的网址,你会连接一段时间。也许“他们”可能会注意到这一点。暂停和恢复,你只能在抓住轨道时连接,否则就会连接。