Bash script: téléchargement de fichiers numérotés consécutifs avec wget

J'ai un serveur web qui enregistre les fichiers journaux d'une application web numérotés. Un exemple de nom de fichier pour cela serait:

dbsclog01s001.log
dbsclog01s002.log
dbsclog01s003.log

Les 3 derniers chiffres sont le compteur et ils peuvent obtenir parfois jusqu'à 100.

J'ouvre généralement un navigateur web, naviguez jusqu'au fichier comme:

http://someaddress.com/logs/dbsclog01s001.log

Et enregistrez les fichiers. Cela devient bien sûr un peu ennuyeux quand vous obtenez 50 journaux. J'ai essayé de trouver un script BASH pour utiliser wget et passer

http://someaddress.com/logs/dbsclog01s*.log

Mais j'ai des problèmes avec mon script. Quoi qu'il en soit, quelqu'un a un échantillon sur la façon de le faire?

Merci!

39
demandé sur wonderer 2009-09-15 15:10:19

11 réponses

#!/bin/sh

if [ $# -lt 3 ]; then
        echo "Usage: $0 url_format seq_start seq_end [wget_args]"
        exit
fi

url_format=$1
seq_start=$2
seq_end=$3
shift 3

printf "$url_format\\n" `seq $seq_start $seq_end` | wget -i- "$@"

Enregistrez ce qui précède comme seq_wget, Donnez-lui l'autorisation d'exécution (chmod +x seq_wget), puis exécutez, par exemple:

$ ./seq_wget http://someaddress.com/logs/dbsclog01s%03d.log 1 50

Ou, si vous avez Bash 4.0, vous pouvez simplement taper

$ wget http://someaddress.com/logs/dbsclog01s{001..050}.log

Ou, si vous avez curl au lieu de wget, Vous pouvez suivre la réponse de Dennis Williamson.

56
répondu ephemient 2018-06-03 08:27:08

curl semble prendre en charge les gammes. De la page man:

URL  
       The URL syntax is protocol dependent. You’ll find a  detailed  descrip‐
       tion in RFC 3986.

       You  can  specify  multiple  URLs or parts of URLs by writing part sets
       within braces as in:

        http://site.{one,two,three}.com

       or you can get sequences of alphanumeric series by using [] as in:

        ftp://ftp.numericals.com/file[1-100].txt
        ftp://ftp.numericals.com/file[001-100].txt    (with leading zeros)
        ftp://ftp.letters.com/file[a-z].txt

       No nesting of the sequences is supported at the moment, but you can use
       several ones next to each other:

        http://any.org/archive[1996-1999]/vol[1-4]/part{a,b,c}.html

       You  can  specify  any amount of URLs on the command line. They will be
       fetched in a sequential manner in the specified order.

       Since curl 7.15.1 you can also specify step counter for the ranges,  so
       that you can get every Nth number or letter:

        http://www.numericals.com/file[1-100:10].txt
        http://www.letters.com/file[a-z:2].txt

Vous avez peut-être remarqué qu'il est écrit "avec des zéros en tête"!

37
répondu Dennis Williamson 2009-09-15 13:06:15

, Vous pouvez utiliser une combinaison de pour i de la bouclen bash avec la printf commande (en cours de modification echo à wget si nécessaire):

$ for i in {1..10}; do echo "http://www.com/myurl`printf "%03d" $i`.html"; done
http://www.com/myurl001.html
http://www.com/myurl002.html
http://www.com/myurl003.html
http://www.com/myurl004.html
http://www.com/myurl005.html
http://www.com/myurl006.html
http://www.com/myurl007.html
http://www.com/myurl008.html
http://www.com/myurl009.html
http://www.com/myurl010.html
11
répondu Mark Rushakoff 2009-09-15 11:15:58

Je ne sais pas exactement quels problèmes vous rencontriez, mais il semble qu'une simple boucle for dans bash le ferait pour vous.

for i in {1..999}; do
wget -k http://someaddress.com/logs/dbsclog01s$i.log -O your_local_output_dir_$i;
done
11
répondu anschauung 2009-09-16 03:04:53

Vous pouvez utiliser des séquences de type echo dans l'url wget pour télécharger une chaîne de nombres...

wget http://someaddress.com/logs/dbsclog01s00{1..3}.log

Cela fonctionne également avec les lettres

{a..z} {A..Z}

8
répondu Stephan 2016-01-04 18:24:48

Tâche intéressante, donc j'ai écrit un script complet pour vous (combiné Plusieurs réponses et plus). Ici, il est:

#!/bin/bash
# fixed vars
URL=http://domain.com/logs/     # URL address 'till logfile name
PREF=logprefix                  # logfile prefix (before number)
POSTF=.log                      # logfile suffix (after number)
DIGITS=3                        # how many digits logfile's number have
DLDIR=~/Downloads               # download directory
TOUT=5                          # timeout for quit
# code
for((i=1;i<10**$DIGITS;++i))
do
        file=$PREF`printf "%0${DIGITS}d" $i`$POSTF   # local file name
        dl=$URL$file                                 # full URL to download    
        echo "$dl -> $DLDIR/$file"                   # monitoring, can be commented
        wget -T $TOUT -q $dl -O $file
        if [ "$?" -ne 0 ]                            # test if we finished
        then
                exit
        fi
done

Au début du script, vous pouvez définir L'URL, le préfixe et le suffixe du fichier journal, le nombre de chiffres que vous avez dans la partie de numérotation et le répertoire de téléchargement. Loop téléchargera tous les fichiers journaux trouvés et quittera automatiquement le premier non existant (en utilisant le délai d'attente de wget).

Notez que ce script suppose que l'indexation des fichiers journaux commence par 1, pas par zéro, comme vous l'avez mentionné dans exemple.

J'espère que cela aide.

1
répondu igustin 2009-09-15 16:27:17

En retard à la partie, mais une VRAIE solution facile qui ne nécessite aucun codage est d'utiliser le DownThemAll Firefox add-on, qui a la fonctionnalité pour récupérer des plages de fichiers. C'était ma solution quand j'avais besoin de télécharger 800 fichiers numérotés consécutivement.

1
répondu Kc Daugirdas 2017-04-28 06:27:28

Ici vous pouvez trouver un script Perl qui ressemble à ce que vous voulez

Http://osix.net/modules/article/?id=677

#!/usr/bin/perl
$program="wget"; #change this to proz if you have it ;-)
my $count=1; #the lesson number starts from 1
my $base_url= "http://www.und.nodak.edu/org/crypto/crypto/lanaki.crypt.class/lessons/lesson";
my $format=".zip"; #the format of the file to download
my $max=24; #the total number of files to download
my $url;

for($count=1;$count<=$max;$count++) {
    if($count<10) {
    $url=$base_url."0".$count.$format; #insert a '0' and form the URL
    }
    else {
    $url=$base_url.$count.$format; #no need to insert a zero
    }
    system("$program $url");
}
0
répondu Carlos Tasada 2009-09-15 11:13:49

Je viens de jeter un oeil à la discussion de la page de manuel wget de 'globbing':

Par défaut, globbing sera activé si L'URL contient un caractère globbing. Cette option peut être utilisée pour activer ou désactiver le globbing de façon permanente. Vous devrez peut-être citer L'URL pour la protéger d'être développée par votre shell. Globbing permet à Wget de rechercher une liste de répertoires, spécifique au système. C'est pourquoi il ne fonctionne actuellement qu'avec les serveurs FTP Unix (et ceux qui émulent Unix " ls" sortie).

Donc wget http://... ne fonctionnera pas avec globbing.

0
répondu pavium 2009-09-15 12:09:10

Vérifiez si votre système A seq, alors ce serait facile:

for i in $(seq -f "%03g" 1 10); do wget "http://.../dbsclog${i}.log"; done

Si votre système a la commande jot au lieu de seq:

for i in $(jot -w "http://.../dbsclog%03d.log" 10); do wget $i; done
0
répondu Hai Vu 2009-09-15 20:14:21

Oh! c'est un problème similaire que j'ai rencontré lors de l'apprentissage de bash pour automatiser manga téléchargements.

Quelque chose comme ça devrait fonctionner:

for a in `seq 1 999`; do
if [ ${#a} -eq 1 ]; then
    b="00"
elif [ ${#a} -eq 2 ]; then
    b="0"
fi
echo "$a of 231"
wget -q http://site.com/path/fileprefix$b$a.jpg

Fait

0
répondu Doug A.K. 2011-01-05 13:10:34