wget -o失败时写入空文件


14

如果我写wget“没有这样的地址” -o“ test.html”,它将首先创建test.html,如果失败,则将其留空。但是,当不使用-o时,它将等待以查看下载是否成功,并且只有在此之后,它将写入文件。

我也希望将后一种行为应用于-o,这可能吗?

Answers:


17

wget 当找不到URL时,返回非零退出状态,因此可以在失败时附加remove命令:

wget "url" -O file || rm -f file

或创建一个临时文件,仅在成功时将其移动到您想要的位置:

wget "url" -O /tmp/wget && mv /tmp/wget file

第二个优点是不会在失败时删除现有文件,但是man tempfile如果并行运行多个实例,请确保使用唯一的临时名称(请参阅参考资料)。


另外,添加--retry-connrefused可以帮助首先防止空文件。
akom

如果这在木偶清单的exec中发生,则将created => file更改为除非=>“ [-s file]”才能使其自愈。
akom

13

正如注释中所写,wget -O 它更像是shell重定向,无论错误如何,该重定向始终写入文件中。

您可以curl -f改用:

curl -f http://nonexistent/file.jpg -o localfile.jpg

如果获取文件时出错,它将不会触摸本地文件。


4

正确的语法是

wget "url" -O file

注意大写字母O。-o选项告诉wget写一个日志文件,这就是为什么即使失败也总是写它的原因。


起初我以为它可以正常工作,但是后来发现却没有。尝试wget“ host.does.not.exist ” -O“ emptyFile”返回错误,但是创建emptyFile。
akurtser

1
@akurtser你是对的。我认为没有办法告诉wget不要创建文件。我找到了这个线程:mail-archive.com/wget@sunsite.dk/msg08586.html,他们在其中讨论了此问题。基线是您可以对同一文件进行多次下载,因此可以创建它,因为wget不能保证所有URL都将失败。
Shunz先生10年

好的,谢谢,这是我正在编写的bash脚本的一部分,因此,我将尝试首先将其保存为一个临时文件,如果成功下载,该文件将被重命名。不是很优雅,但是想不到更好的了。
akurtser

1
@akurtser当然,您可以从wget检查返回代码,然后...它应该告诉您是否可以删除文件“ if not found”。因此无需临时/重新命名。
Shunz先生10年

1
-O选项是重定向,即使在没有内容的情况下,它也会将下载的内容重定向到文件。因此,即使下载失败,也会始终创建文件。
Quan To

0

根据帮助文档(wget -h),可以使用--spider选项跳过下载(版本1.14)。

Download:
  -S,  --server-response         print server response.
       --spider                  don't download anything.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.