wget -o écrit des fichiers vides en cas d'échec

14

Si j'écris wget "no such address" -o "test.html", il crée d'abord le test.html et en cas d'échec, le laisse vide. Cependant, si vous n'utilisez pas -o, il attendra pour voir si le téléchargement réussit et seulement après cela, il écrira le fichier.

J'aimerais que ce dernier comportement soit également appliqué à -o, est-ce possible?

akurtser
la source

Réponses:

17

wget renvoie un état de sortie différent de zéro lorsque l'URL est introuvable, vous pouvez donc ajouter une commande de suppression en cas d'échec:

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

Ou créez un fichier temporaire et déplacez-le uniquement où vous le souhaitez en cas de succès:

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

La seconde a l'avantage de ne pas supprimer un fichier existant en cas d'échec, mais assurez-vous d'utiliser des noms temporaires uniques (voir man tempfile) si vous exécutez plusieurs instances en parallèle.

Ian Mackinnon
la source
De plus, l'ajout de --retry-connrefused peut aider à empêcher le fichier vide en premier lieu.
akom
Si cela se produit dans un exécutable dans un manifeste de marionnettes, le changement de create => file à moins que => "[-s file]" puisse le rendre auto-réparateur.
akom
13

Comme écrit dans les commentaires, wget -O ressemble plus à une redirection de shell qui écrit toujours dans le fichier indépendamment des erreurs.

Vous pouvez utiliser à la curl -fplace:

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

Il ne touchera pas le fichier local en cas d'erreur lors de la récupération du fichier.

cweiske
la source
4

La syntaxe correcte est

wget "url" -O file

notez la MAJUSCULE O. Les options -o indiquent à wget d'écrire un fichier journal , c'est pourquoi il est toujours écrit même en cas d'échec.

M. Shunz
la source
Au début, je pensais que cela fonctionnait, mais j'ai trouvé que non. essayez wget " host.does.not.exist " -O "emptyFile" Une erreur est renvoyée, mais le emptyFile est créé.
akurtser
1
@akurtser vous avez raison. Je pense qu'il n'y a aucun moyen de dire à wget de ne pas créer le fichier. J'ai trouvé ce fil: mail-archive.com/[email protected]/msg08586.html dans lequel ils discutent de la question. La ligne de base est que vous pouvez avoir plusieurs téléchargements dans le même fichier afin qu'il soit créé car wget ne peut pas être sûr que TOUTES les URL échoueront.
M. Shunz
Eh bien merci, cela fait partie d'un script bash que j'écris, donc je vais juste essayer de l'enregistrer d'abord un fichier temporaire, qui en cas de téléchargement réussi, sera renommé. Pas très élégant, mais je ne vois rien de mieux.
akurtser
1
@akurtser Vous pouvez sûrement vérifier le code retour de wget alors ... il devrait vous dire si vous pouvez supprimer le fichier "s'il n'est pas trouvé". Donc pas besoin de temp / renommage.
M. Shunz
1
L'option -O est une redirection, qui redirige le contenu téléchargé vers un fichier, même dans les cas où il n'y a pas de contenu. Par conséquent, un fichier est toujours créé, même si le téléchargement a échoué.
Quan au
0

Selon le document d'aide (wget -h), vous pouvez utiliser l'option --spider pour ignorer le téléchargement (version 1.14).

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

rocky qi
la source