【问题标题】:Download latest file from remote server using curl使用 curl 从远程服务器下载最新文件
【发布时间】:2020-02-29 05:21:40
【问题描述】:

我可以使用以下 curl 命令成功下载文件。

curl -u user:pass -k "https://website.com/remote/path/remotefile.zip" -o /local/path/file.zip

理想情况下,我想通过以编程方式获取最新文件来自动执行此操作。每天可以上传多个文件。每个文件的名称都以时间戳为前缀,目录中有多个文件。

目录内容和文件名示例:

20191102230243952_Appended-Constant_Filename.zip
20191103040135476_Appended-Constant_Filename.zip
20191103100132360_Appended-Constant_Filename.zip

更新 @FedonKadifeli 的评论。如果对包含文件的目录发出请求,则会返回列出文件的 HTML 输出。

curl -u user:pass -k "https://website.com/remote/path"

HTML 输出

[...]
<table>
    <tr>
        <td align="left">&nbsp;&nbsp;
            <a href="/remote/path/20191102230243952_Appended-Constant_Filename.zip"><tt>20191102230243952_Appended-Constant_Filename.zip</tt></a>
        </td>
        <td align="right"><tt>66.6 kb</tt></td>
        <td align="right"><tt>Sun, 03 Nov 2019 06:02:44 GMT</tt></td>
    </tr>
    <tr bgcolor="#eeeeee">
        <td align="left">&nbsp;&nbsp;
            <a href="/remote/path/20191103040135476_Appended-Constant_Filename.zip"><tt>20191103040135476_Appended-Constant_Filename.zip</tt></a>
        </td>
        <td align="right"><tt>66.6 kb</tt></td>
        <td align="right"><tt>Sun, 03 Nov 2019 12:01:35 GMT</tt></td>
    </tr>
    <tr>
        <td align="left">&nbsp;&nbsp;
            <a href="/remote/path/20191103100132360_Appended-Constant_Filename.zip"><tt>20191103100132360_Appended-Constant_Filename.zip</tt></a>
        </td>
        <td align="right"><tt>66.5 kb</tt></td>
        <td align="right"><tt>Sun, 03 Nov 2019 18:01:32 GMT</tt></td>
    </tr>
</table>
[...]

【问题讨论】:

  • 这似乎只有在您可以列出path 文件夹的内容时才有可能。对 URL https://website.com/remote/path/ 的请求是否返回正确的文件列表?
  • @FedonKadifeli 它返回目录中所有文件的 HTML 列表。请参阅问题更新。
  • 有些东西不匹配。该文件名为 /remote/path/remotefile.zip,但清单显示 /remote/path20191103040135476_Appended-Constant_Filename.zip。
  • 如果服务器运行的是 Apache,您可能会在列表中添加其他选项:?C=N(按名称排序)和 F=0(简单列表,无 HTML),这可以简化解析显着。
  • @dash-o 这是我在清理路径详细信息时的拼写错误,已更新。感谢您提供有关添加 Apache 选项的建议。我可以在浏览器中点击 URL 并尝试添加像 website.com/remote/path?C=N;F=0 这样的参数,但输出是一样的。

标签: bash curl


【解决方案1】:

一个小的 SED 脚本可以从列表中提取文件名。 sort/head 会得到最新的文件名

P=https://website.com/remote/path
curl .. "$P/" > listing.txt
LATEST=$(sed -ne '/href=/{s@.*href=".*/\([0-9]\+_[^"]\+\).*@\1@p}' < listing.txt | sort -nr | head -1)
curl ... "$P/$LATEST"

【讨论】:

  • 谢谢!当我运行它时,我得到了这个,sed: 1: "/href=/{s@.*href=".*/\( ...": bad flag in substitute command: '}'
  • 你能指定操作系统和外壳吗?它适用于 Mint 19/Bash
  • 你是对的!我把它扔到 linux 服务器上,它按预期工作。我在本地运行 macOS 10.15.0/Bash,这就是我遇到问题的地方。知道为什么吗?
  • @Blaine 我没有 MacOS。你能得到 'sed' & shell(bash?)version 吗?
  • MacOS 可以试试简单的 sed sed -ne '/href=/s@.*href=".*/\([0-9]\+_[^"]\+\).*@\1@p'
猜你喜欢
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
  • 2016-05-24
  • 1970-01-01
  • 2015-07-27
  • 1970-01-01
  • 2012-06-15
相关资源
最近更新 更多