PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : bash script zum auto. download von files, URLs finden sich in rss_feeds



hmikux
25-01-2011, 21:38
Hallo Leute,

ich brauche noch etwas Hilfe um mein shell-script fertigzustellen. Der Anfang ist gemacht, nur fehlt mir nötiges Wissen um den Hauptteil zu realisieren.
Folgendes ist die Aufgabe:
Ich kann per rss-feed checken, ob neue files zum download bereitstehen. Wenn dies der Fall ist, möchte ich dies tun. Wenn das file jedoch von mir bereits runtergeladen wurde, soll das script das file nicht ein zweites mal runterladen.

Das was ich bisher vom script geschrieben habe, möchte ich mal in einzelnen Sektionen beschreiben:

Section1: Download des rssfeeds und Ausgabe umleiten in xml-file.
Section2: Pruefen ob neue files vorhanden sind. Die URLs der files findet man als Information im xml-file. Folgendermassen gekennzeichnet: <guid>URL-link</guid>
Wenn links im xml-file als URL gefunden werden, sollen diese in ein separates File gespeichert werden - jedoch so modifiziert, das ich dies an wget übergeben kann.
Section3: Wenn nun NEUE URLs gefunden werden sollen diese per wget lokal runtergeladen werden. Nach erfolgreichem downlaod, soll ein log mit timestamp in /mnt/xxxx/download.log inkl. URL geschrieben werden.
Section4: clean-up


#!/bin/sh

# section1
wget "http://xxxx/hq" -O /mnt/xxxx/rssfeed_all.xml
sleep 1

# section2
grep 'guid' /mnt/xxxx/rssfeed_all.xml &> /dev/null
if [ "$?" != "0" ]; then
echo $(date) "- No new files to download..." >> /mnt/xxxx/download.log
else
grep 'guid' /mnt/xxxx/rssfeed_all.xml \
| sed -n -e 's! <guid>!!gp' | sed -n -e 's!</guid>!!gp' \
>> /mnt/xxxx/rssfeed_urls.txt
fi

#section3
????? DAS BRAUCHE ICH NOCH ;) ?????

# section4
rm -f /mnt/xxxx/rssfeed_all.xml
rm -f /mnt/xxxx/rssfeed_urls.txt
echo; echo 'All temporary files deleted...done'

exit 0

Section3-Problematik:
Es koennte durchaus sein, das mehrere URLs im xml-file vorhanden sind. Diese muesste ich als Liste an grep (zur Pruefung) uebergen, zum checken, ob diese vielleicht schon runtergeladen wurden. Wenn JA, dann findet man diesbezueglich bereits einen LOG-Eintrag. Wenn NEIN, muss die URL aus der Liste an wget uebergeben werden, um diese runterzuladen und dann nach erfolgreichen download einen neuen LOGeintrag in das file 'download.log' anhaengen.

Ich muss wahrscheinlich aus 'rssfeed_urls.txt' eine Liste erzeugen. Den Inhalt (line per line) per grep verifizieren, ob vielleicht im download.log schon etwas vorhanden ist. Wenn ja, dann keine Aktion (für diese spezielle URL, weiter mit der nächsten line). Wenn NEIN, dann Uebergabe an wget und im Anschluss einen neuen LOG-Eintrag inkl. timestamp.
Es kann durchaus sein, das mal nur ein file bereitsteht (also als Resultat eine line aus section2) oder auch mehrere, das bedeutet mehrere lines als Resultat aus section2.

Könnt ihr mir diesbezüglich etwas helfen. Vielen Dank.
hmikux

John W
26-01-2011, 18:24
Vielleicht wget mit continue-Parameter aufrufen? Sollte eigentlich klappen, dann lässt sich das schon auf eine Zeile reduzieren:


wget -o /dev/null -O - "$URL" | sed -nr 's#<guid>([^<]+)</guid>#\1#p' | wget -c -i -
Der erste wget-Aufruf lädt den RSS-Feed runter und übergibt den Inhalt an sed.
Sed extrahiert daraufhin alles, was zwischen <guid> und </guid> steht und gibt das an den 2. wget-Aufruf weiter.
Dieser Aufruf wiederum bezieht die zu herunter zu ladenen Dateien von der Standardeingabe (also von sed) und setzt Downloads bereits existierender Dateien fort - sofern der Server das unterstützt, ansonsten gibt es eine Fehlermeldung; wenn die Datei schon fertig runtergeladen wurde, passiert nichts (sieh dir die Manpage dazu an).

hmikux
26-01-2011, 19:23
Hi John,

das ist ja mal ein ganz anderer Ansatz als ich verfolgt habe. Wenn das wirklich so funktionieren würde..nicht schlecht. Was mir jedoch bei deiner Variante einfällt: Wenn ich das file zwischenzeitlich in ein anderes Verzeichnis kopieren, dann kommt es doch erneut zum download.


Ich habe zu meinem Problem mal folgendes entwickelt:


for FILE in `cat /mnt/xxxx/rssfeed_urls.txt` ; do

grep $FILE /mnt/xxxx/download.log &> /dev/null
if [ "$?" = "1" ]; then
wget $FILE -P /mnt/xxxx/
echo $(date) "- "$FILE "- DONE" >> /mnt/xxxx/download.log
fi

done