Ubuntu命令仅在origin不为空时才复制文件

时间:2017-04-18 18:46:56

标签: shell curl cron

我有一个cronjob从JSON格式的网站获取价格列表并将其复制到正确的文件夹中,它看起来像这样:

curl 'https://somesite.web/api/list.json' > ~/list.json.tmp && cp ~/list.json.tmp /srv/www/list.json > /dev/null

问题是,当cron试图获取列表并获得一个空的JSON文件时,网站出现了几次失败。为了防止将来出现这种情况,有没有办法让cron只复制文件,如果它不是空的(没有cp选项来执行此操作)?或者我应该创建一个脚本来执行此操作并在获取列表后调用脚本?

2 个答案:

答案 0 :(得分:2)

也许curl --fail会达到你想要的效果?从手册页:

  

-f, - fail
  (HTTP)服务器错误无提示失败(根本没有输出)。这主要是为了更好地启用脚本等以更好地处理失败的尝试。在正常情况下,当HTTP服务器无法传递文档时,它会返回一个HTML文档(通常也会描述原因和更多)。此标志将阻止curl输出该值并返回错误22。

这会导致curl以失败代码退出,因此语句中的&&将不会执行副本。

答案 1 :(得分:1)

curl ... && [ -s ~/list/json.tmp ] && cp ~/list/json.tmp /srv/www/list.json

如果指定的文件存在且不为空,则-s测试为真。

(顺便说一下,> /dev/null重定向不是必需的。cp命令可能会向stderr打印错误消息,但它不应该向stdout打印任何内容,这就是你要重定向的内容。)