web-dev-qa-db-fra.com

Script BASH: Télécharger des fichiers numérotés consécutifs avec wget

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

dbsclog01s001.log
dbsclog01s002.log
dbsclog01s003.log

Les 3 derniers chiffres constituent le compteur et peuvent aller jusqu’à 100.

J'ouvre habituellement un navigateur Web, naviguez jusqu'au fichier comme:

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

et enregistrez les fichiers. Bien sûr, cela devient un peu gênant lorsque vous obtenez 50 journaux ... J'ai essayé de créer un script BASH pour utiliser wget et le transmettre.

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

mais j'ai des problèmes avec mon script. Quoi qu'il en soit, quelqu'un a-t-il un exemple pour savoir comment procéder?

merci!

40
wonderer
#!/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 sous le nom seq_wget, donnez-lui l'autorisation d'exécution (chmod +x seq_wget), puis exécutez-le, 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.

57
ephemient

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

URL 
 La syntaxe de l'URL dépend du protocole. Vous trouverez un descrip ‐.__ détaillé. dans RFC 3986 .

 Vous pouvez spécifier plusieurs URL ou parties d'URL en écrivant des jeux de pièces 
 entre accolades comme dans: 

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

 ou vous pouvez obtenir des séquences de séries alphanumériques en utilisant [] comme dans: 

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

 Aucune imbrication des séquences n'est prise 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¹/4//// Vous pouvez spécifier n’importe quelle quantité d’URL sur la ligne de commande. Ils seront
 extrait de manière séquentielle dans l'ordre spécifié .

 Depuis curl 7.15.1, vous pouvez également spécifier un compteur de pas pour les plages, donc 
 que vous pouvez obtenir chaque Nième chiffre ou 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 écrit "avec des zéros non significatifs"!

37
Dennis Williamson

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 aussi avec des lettres

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

11
Stephan

Je ne sais pas exactement quels problèmes vous avez rencontrés, 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
11
anschauung

Vous pouvez utiliser une combinaison de a pour la boucle i n bash avec la commande printf (bien sûr modifier 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
11
Mark Rushakoff

Tâche intéressante, j'ai donc écrit le script complet pour vous (combiné plusieurs réponses et plus). C'est ici:

#!/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 numérotation et le répertoire de téléchargement. Loop téléchargera tous les fichiers de log trouvés, et se fermera automatiquement au premier non-existant (en utilisant le délai d'attente de wget).

Notez que ce script suppose que l'indexation du fichier journal commence par 1, et non par zéro, comme vous l'avez mentionné dans l'exemple.

J'espère que cela t'aides.

1
igustin

En retard pour la soirée, mais une solution simple et efficace ne nécessitant aucun codage consiste à utiliser le module complémentaire DownThemAll Firefox, qui permet de récupérer des plages de fichiers. C'était ma solution lorsque j'ai eu besoin de télécharger 800 fichiers numérotés consécutivement. 

0
Kc Daugirdas

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
Carlos Tasada

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
Hai Vu

Je viens tout juste de jeter un coup d’œil à la discussion de la page de manuel wget sur «globbing»:

Globing sera activé par défaut si l'URL contient un caractère globing. Cette option peut être utilisée pour activer ou désactiver la navigation en permanence de manière permanente ..__ Vous devrez peut-être indiquer l'URL pour éviter son extension 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 émulant la sortie "ls" Unix).

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

0
pavium

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

Quelque chose comme ça devrait marcher:

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

terminé

0
Doug A.K.