【问题标题】:How to perform an action only when a newer file was downloaded by wget or curl?仅当 wget 或 curl 下载了较新的文件时,如何执行操作?
【发布时间】:2015-02-09 10:29:21
【问题描述】:

我正在寻找一个简单的 bash 解决方案,以便在像 wget --timestamp https://example.com/my.file 这样的命令之后更新文件时执行操作

我观察到 wget 在两种情况下都返回 0,当文件已经是最新版本时,并且当它确实下载了较新版本时。

在 bash 中实现此功能的最简单方法是什么?

【问题讨论】:

  • 另存为不同的文件,然后比较它们,如果它们不同,则执行任何操作
  • @JID 我宁愿在运行 wget 并在执行后检查它之前将文件的日期时间保存在变量中。我不想无缘无故地向磁盘添加新文件。
  • 我不会说这是没有充分理由的,因为它可以解决您的问题。根据文件的大小,它可能会在磁盘上停留不到几秒钟。您也可以使用-qO- 并将其生成的标准输出与原始标准输出进行比较。或者您可以按照您所说的将日期时间保存到变量中,尽管我不知道在这种情况下问题的重点是什么。
  • 如果远程文件支持HTTP HEAD,请使用curl -I https://example.com/my.file并将本地文件上的时间戳与远程文件的Last-Modified头值进行比较
  • 您可以使用inotifywait 来检查文件更改。

标签: bash curl wget


【解决方案1】:

你可以使用stat -c %y保存最后一次数据修改的时间戳,在wget执行前后。如果两个时间戳不同,则运行您的操作。

t1=$(stat -c %y $FILE)
wget https://example.com/$FILE
t2=$(stat -c %y $FILE)
if [ "$t1" != "$t2" ]; then
   echo "Do something"
fi

如果您使用的是类似 BSD 的 Unix,例如 macos,请使用 stat -f %m 而不是 stat -c %y

【讨论】:

  • 很棒的解决方法...旁注:这将产生[: too many arguments 错误。 (统计时间戳有空格)。使用双方括号或双引号...见stackoverflow.com/a/13781217/1601332
  • 感谢您的评论,我已经相应地修改了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-21
  • 1970-01-01
  • 1970-01-01
  • 2015-02-20
  • 2011-05-04
相关资源
最近更新 更多