包含 8 个随机整数的字符串的 wget 或 curl 文件

wget or curl file containing string of 8 random integers

我想每天下载一个播客。它采用 mp3 文件的形式,因此目标文件的扩展名始终相同。文件名的第一部分也没有改变——我们称它为 ProgName-。文件名的另一部分以可预测的方式变化;它是今天的日期,格式为 01-01-1999。但是文件名的中间部分以相当不可预测的方式发生变化:它包含一个显然为 运行dom 整数的 8 字符串。文件名的结尾,即扩展名之前的部分,也不会改变——假设它是“-full”。因此,1999 年 1 月 1 日的示例文件名如下所示:ProgName-01-01-1999-01238764-full.mp3。第二天(1 月 2 日)的文件将命名为 ProgName-01-02-1999-23871640-full.mp3。等等。

这些文件可通过 http 访问,一旦我通过浏览网页找到完整路径,就可以使用 wget 下载它们。但我正在尝试将其自动化,并希望能够在每天的特定时间 运行 完成一个 cron 作业,在我确定最新一集可用的时候。例如

wget http://my.desiredurl.here/downloads/ProgName-01-01-1999-01238764-full.mp3

成功将文件 ProgName-01-01-199-01238764-full.mp3 下载到我的计算机(非认证站点)。但是直到我想出一种方法(也许通过使用通配符或大括号扩展?)来自动执行此操作之前,我一直在手动下载。所以我想寻求帮助。

我已经阅读了一些关于大括号扩展的文章,但我对 bash 的了解还很初级,所以我有点猜测这可能是如何工作的。我可以期待

wget http://my.desiredurl.here/downloads/ProgName-01-01-1999-{00000000..99999999}-full.mp3

上班?这甚至是做这类事情的最佳方式吗?我想我对如何自动输入文件名的日期部分感到困惑,但目前对整数字符串感到困惑。将不胜感激。

PS 在发帖之前,我对这个问题进行了大量的谷歌搜索。我 运行 遇到的大多数 wget 解决方案都涉及 globbing 和递归下载,这确实不是我需要的。目标站点上有许多 .mp3 文件,但我只需要其中一个。我需要一种方法来过滤除包含今天日期的目标文件之外的所有文件。 curl 也在我的机器上,可以用于此,尽管我的重点是 wget,我更熟悉它。

告诉 wget 过滤您期望的文件名模式,然后将 URL 交给它,您希望从中可以下载 link。

这看起来像:

date=$(date +%m-%d-%Y) # aside: Awful date format; %Y-%m-%d is what sane folks use.
expected_name="ProgName-$date-*.mp3"

wget --recursive --level=2 --accept "$expected_name" http://my.desiredurl.here/

注意 --level=2 -- 这限制了递归的深度。修改为相对于提供的 URL 所需的最小值(并尽量使 URL 尽可能靠近下载位置 link)。

我想我已经找到了解决这个问题的方法。比我预想的要复杂一些,但到目前为止的测试表明它应该可以完成这项工作。 1) 意识到使用 curl 或 wget 我可以下载一个 xml 文档,其中包含(除其他外)我需要的直接 link;和 2) 运行 跨越指令,其中一些我已经重新分配,用于在 http://nylinuxhelp.com/blogs/command-line/download-several-files-part-2.

做一些与我的任务至少有一些相似之处的事情

首先,我使用 curl 获取包含所需 URL 的 xml 文件。我将其作为输出传递给 grep,告诉它搜索以 http 开头并以 mp3 结尾的字符串,并在找到第一个结果后结束搜索; -m 1,这恰好是我瞄准的最近一集。最后,该 grep 命令的输出通过 xargs 传输到 wget,wget 下载,然后重命名文件。完整的一行代码如下所示:

curl http://my.desiredurl.here/level1/level2/ | grep -m 1 -o "http:.*mp3" | xargs -n1 wget -O MyDownloaded.mp3

我需要做进一步的测试以确保它在设置为 cron 作业时能够按预期工作。我可能可以从该例程的 xargs 段中删除 -n1,因为我应该一次只从 xargs 一个 URL 馈送到 wget。我也应该将其嵌入原始 bash 脚本中,因为我想按照上面 Charles 演示的方式将日期合并到文件名中。

后期编辑:今晚我运行 测试了这个脚本,该脚本设置为 cron 作业,并且表现非常出色。当然,它非常原始,没有错误检查、日志记录或无关输出的重定向。所以它当然可以使用改进。我的 bash "skills," 就这样,不允许我做比我已经拥有的更多的事情,所以我暂时按原样处理。