使用wget覆盖文件,但在完整文件接收之前使用临时文件名,然后重命名。

12

我正在使用wget在cron任务中,每分钟将一个.jpg文件下载到Web服务器文件夹中(每次都使用相同的文件名进行覆盖)。这个文件夹是“实时”的,因为Web服务器还会从那里提供该图像。但是,如果有人在获取图像时通过Web浏览器浏览该页面,则该图像被视为带有错误的jpg,并在浏览器中显示错误信息。因此,我需要做的是类似于Firefox下载文件时,wget应该将文件写入临时文件中,可以在/var或目标文件夹中以临时名称进行重命名,直到下载完整个文件后再进行原子(或至少是可忽略的)步骤。

我已经阅读了wget手册,似乎没有这样的命令行选项。我错过了吗?还是我需要在cron工作中执行两个命令,即wget和move?


2
我有完全相同的需求...我会像你所提到的那样以编程的方式完成它:在tmp文件夹中使用wget +移动。 - pierroz
2个回答

4

纯用GNU Wget无法实现这一点。

wget的任务是下载文件,它可以完成这个任务。一个简单的一行脚本可以实现你所需要的功能:

$ wget -O myfile.jpg.tmp example.com/myfile.jpg && mv myfile.jpg{.tmp,}

由于在Linux上mv是原子的,因此您可以获得就绪文件的原子更新。


0

我想分享我的解决方案:

alias wget='func(){ (wget --tries=0 --retry-connrefused --timeout=30 -O download_pkg.tmp "$1" && mv download_pkg.tmp "${1##*/}") || rm download_pkg.tmp;  unset -f func; }; func

它创建了一个函数,接收一个名为"url"的参数来将文件下载到临时名称。如果成功,它将使用${1##*/}从参数$1中提取正确的文件名进行重命名。如果失败,则删除临时文件。如果操作被中止,则在下一次运行时将替换临时文件。最后,unset -f会删除函数定义,因为别名已执行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接