46 votes

Script BASH: 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 nom de fichier exemple de ce serait:

dbsclog01s001.log
dbsclog01s002.log
dbsclog01s003.log

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

J'ai l'habitude d'ouvrir un navigateur web, accédez au fichier comme:

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

et enregistrer les fichiers. Bien sûr, cela devient un peu gênant quand vous obtenez 50 journaux. J'ai essayé de venir avec un script BASH pour l'utilisation de wget et en passant

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

mais j'ai des problèmes avec mon script. De toute façon, quelqu'un a un exemple sur la façon de faire cela?

merci!

63voto

ephemient Points 87003
 #!/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- "$@"
 
$ ./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.

41voto

Dennis Williamson Points 105818

curl semble à l'appui des plages. De la man page:

URL 
 La syntaxe de l'URL selon le protocole. Vous trouverez détaillé de la descrip‐
 tion dans la RFC 3986.

 Vous pouvez spécifier plusieurs adresses Url ou des parties de l'Url par l'écriture de la partie fixe
 à l'intérieur des accolades, comme dans:

http://site.{un,deux,trois}.com

 ou vous pouvez obtenir des séquences de alphanumérique de la série en utilisant [] comme dans:

ftp://ftp.numericals.com/file[1-100].txt
 ftp://ftp.numericals.com/file[001-100].txt (avec des zéros)
ftp://ftp.letters.com/file[a-z].txt

 Pas d'imbrication de séquences est pris en charge pour le moment, mais vous pouvez utiliser
 plusieurs les uns à côté des autres:

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

 Vous pouvez spécifier n'importe quel montant d'Url sur la ligne de commande. Ils seront
 récupérée de manière séquentielle dans l'ordre spécifié.

 Depuis curl 7.15.1 vous pouvez également spécifier compteur de pas pour les plages, donc
 que vous pouvez obtenir chaque Nième chiffre ou de la lettre:

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 dit "avec les zéros non significatifs"!

14voto

anschauung Points 2689

Je ne sais pas exactement quels problèmes vous rencontriez, mais cela ressemble à une simple boucle for 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
 

11voto

Mark Rushakoff Points 97350

Vous pouvez utiliser une combinaison d' une boucle for i n bash avec la commande printf (en modifiant bien sûr echo en 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
 

2voto

igustin Points 572

Travail intéressant, j'ai donc é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 beggiing du script, vous pouvez définir l'URL, fichier journal préfixe et le suffixe, du nombre de chiffres que vous avez dans la numérotation de la partie et le répertoire de téléchargement. Boucle va télécharger tous les fichiers de log il a trouvé, et automatiquement la sortie sur le premier non-existant (à l'aide de wget du délai d'attente).

Notez que ce script suppose que le fichier de log de l'indexation commence par 1, pas nul, comme vous l'avez mentionné dans l'exemple.

Espérons que cette aide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X