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!
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.
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"!
, 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
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
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}
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.
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.
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");
}
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.
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
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