BASH Skript: Das Herunterladen von aufeinanderfolgenden nummerierte Dateien mit wget
Frage
Ich habe einen Web-Server, der die Log-Dateien einer Web-Anwendung speichert nummeriert. Ein Dateiname Beispiel hierfür wäre:
dbsclog01s001.log
dbsclog01s002.log
dbsclog01s003.log
Die letzten drei Ziffern sind die Zähler und sie können manchmal bis zu 100 erhalten.
ich in der Regel einen Web-Browser öffnen, navigieren Sie zu der Datei wie:
http://someaddress.com/logs/dbsclog01s001.log
und speichern Sie die Dateien. Dies natürlich wird es ein wenig ärgerlich, wenn Sie 50 Protokolle erhalten. Ich habe versucht, mit einer BASH-Skript zu kommen für die Verwendung von wget und vorbei
http://someaddress.com/logs/dbsclog01s*.log
, aber ich habe Probleme mit meinem Skript haben. Wie auch immer, jemand hat eine Probe auf, wie dies zu tun?
Danke!
Lösung
#!/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- "$@"
Speichern Sie die oben als seq_wget
, geben sie die Ausführung Erlaubnis (chmod +x seq_wget
), und dann laufen, zum Beispiel:
$ ./seq_wget http://someaddress.com/logs/dbsclog01s%03d.log 1 50
Oder, wenn Sie haben Bash 4.0, könnten Sie geben Sie einfach
$ wget http://someaddress.com/logs/dbsclog01s{001..050}.log
Oder, wenn Sie statt curl
wget
haben, könnten Sie Dennis Williamson Antwort folgen.
Andere Tipps
curl
scheint Bereiche zu unterstützen. Von der man
Seite:
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
Sie haben vielleicht bemerkt, dass es heißt „mit führenden Nullen“!
Sie können die Echo-Typ-Sequenzen in der wget URL verwenden, um eine Reihe von Zahlen zum Download ...
wget http://someaddress.com/logs/dbsclog01s00{1..3}.log
Das funktioniert auch mit den Buchstaben
{a..z} {A..Z}
Sie können eine Kombination von i mit n bash der printf Befehl (natürlich echo
Modifikation nach Bedarf wget
):
$ 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
Nicht sicher genau das, was Probleme, die Sie wurden erlebt, aber es klingt wie eine einfache for-Schleife in bash wäre es für Sie tun.
for i in {1..999}; do
wget -k http://someaddress.com/logs/dbsclog01s$i.log -O your_local_output_dir_$i;
done
Interessante Aufgabe, so schrieb ich vollständige Skript für Sie (kombiniert mehrere Antworten und mehr). Hier ist sie:
#!/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
Am beggiing des Skripts Sie URL festlegen können, Protokolldatei-Präfix und Suffix, wie viele Stellen Sie in Numerierungsteileinstelltaste und Download-Verzeichnis haben. Schleife wird alle Logfiles herunterladen gefunden, und automaticaly Ausfahrt auf den ersten nicht-existente (wget des Timeout verwendet wird).
Beachten Sie, dass dieses Skript geht davon aus, dass Logfile Indizierung mit 1 beginnt, nicht Null ist, wie Sie in Beispiel erwähnt.
Hope, das hilft.
Hier können Sie ein Perl-Skript finden, das so aussieht, was Sie wollen
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");
}
Ich hatte nur einen Blick auf die wget manpage Diskussion von 'Globbing':
In der Standardeinstellung Globbing wird eingeschaltet, wenn die URL ein Globbing Zeichen enthält. Diese Option kann verwendet werden, um zu drehen Globbing ein- oder ausgeschaltet dauerhaft. Ebenso können Sie die URL zitieren müssen, um sie zu schützen, von der Shell erweitert. Globbing macht Wget für eine Verzeichnisliste suchen, die systemspezifisch ist. Das ist, warum es funktioniert derzeit nur mit Unix-FTP-Server (und die, die emuliert Unix "ls" -Ausgabe).
So wget http:. // ... wird nicht funktionieren mit Globbing
Überprüfen Sie, ob Ihr System seq hat, dann wäre es einfach:
for i in $(seq -f "%03g" 1 10); do wget "http://.../dbsclog${i}.log"; done
Wenn Ihr System hat den jot Befehl statt f:
for i in $(jot -w "http://.../dbsclog%03d.log" 10); do wget $i; done
Oh! dies ist ein ähnliches Problem, das ich in lief, wenn bash Lernen manga-Downloads zu automatisieren.
So etwas sollte funktionieren:
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
gemacht
spät zur Party, aber eine echte einfachen Lösung, die keine Codierung benötigt, ist die DownThemAll Firefox Add-on zu verwenden, was die Funktionalität reicht von Dateien abrufen muss. Das war meine Lösung, wenn ich 800 fortlaufend nummerierte Dateien zum Download erforderlich.