BASH Skript: Das Herunterladen von aufeinanderfolgenden nummerierte Dateien mit wget

StackOverflow https://stackoverflow.com/questions/1426522

  •  07-07-2019
  •  | 
  •  

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!

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top