wget erzeugt 0 Byte Dateien!?

Software besorgen und anwenden
Antworten
Nachricht
Autor
Benutzeravatar
fantaeiner
Beiträge: 53
Registriert: 31. Dez 2004 14:44
Kontaktdaten:

wget erzeugt 0 Byte Dateien!?

#1 Beitrag von fantaeiner » 23. Sep 2005 15:24

Ich habe in meiner crontab ein automatisches Laden mit wget realisiert, um eine Datei regelmäßig zu laden (Wolkendatei für xplanet). Das Problem: steht die Internetverbindung nicht, dann überschreibt wget die alte (Wolken)Datei mit einer 0 Byte Datei. Die Information ist also weg. Gibt es einen Befehl, der dafür sorgt, dass erst nach ERFOLGREICHEM Download die bestehende Datei überschrieben wird?

Eine Idee?

Gruß Fanta

Benutzeravatar
Lateralus
prolinux-forum-admin
Beiträge: 1238
Registriert: 05. Mai 2004 7:35

#2 Beitrag von Lateralus » 23. Sep 2005 17:34

Eine Möglichkeit wäre, die Datei, welche du verwenden willst, immer umzubenennen - und zwar nur dann, wenn wget 0 beim Beenden zurückgab (also hier im Beispiel wget_success auf 1 gesetzt wird):

Code: Alles auswählen

#!/bin/bash
wget_success=0
wget blabliblub.de/bla.txt || wget_success=1

if [ "$wget_success" -eq 1 ]; then
        mv bla.txt real_bla.txt
else
        echo wget nicht erfolgreich
fi

Benutzeravatar
fantaeiner
Beiträge: 53
Registriert: 31. Dez 2004 14:44
Kontaktdaten:

#3 Beitrag von fantaeiner » 23. Sep 2005 18:58

Vielen Dank für Deine Antwort. So ähnlich habe ich es schon versucht, aber da ich von den Shell-Scripten nicht viel Ahnung habe, konnte ich Deine Idee letzendlich aufgreifen und anpassen. Mein Code:
[code]
#!/bin/bash
wget_success=0
wget -q -N http://rcswww.urz.tu-dresden.de/~es1792 ... s_2048.jpg -O /home/asmb/.xplanet/images/cloud_zwischen.jpg && wget_success=1

if [ "$wget_success" -eq 1 ]; then
mv ~/.xplanet/images/cloud_zwischen.jpg ~/.xplanet/images/cloud.jpg
#echo wget ERFOLGREICH
#else
#echo wget nicht erfolgreich
fi
[/code]

statt mv kann auch cp für kopieren verwandt werden. Das klappt ganz gut!
Ich versuche noch etwas anderes mit Größenberechnung.

Benutzeravatar
Lateralus
prolinux-forum-admin
Beiträge: 1238
Registriert: 05. Mai 2004 7:35

#4 Beitrag von Lateralus » 23. Sep 2005 19:37

Code: Alles auswählen

wget -q -N http://rcswww.urz.tu-dresden.de/~es179238/clouds_2048.jpg -O /home/asmb/.xplanet/images/cloud_zwischen.jpg && wget_success=1
Das wird nicht zum Erfolg führen. Du musst "||" - Oder statt "&&" - Und verwenden. Die Bash kontrolliert dann den Gesamtausdruck, ob er wahr ist. Wenn ein Oder verwendet wird, muss die Bash, falls der erste Ausdruck 0 (also ein fehlerfreies wget) ist, den zweiten mit kontrollieren (also wget_success auf 1 setzen (ist immer wahr)). Wenn du Und benutzt, muss die Bash in jedem Fall den zweiten Ausdruck auch kontrollieren (setzt also in jedem Fall wget_success auf 1).

fantaeiner2

so gehts

#5 Beitrag von fantaeiner2 » 23. Sep 2005 19:48

Ich habe das jetzt noch einmal geändert. So gefällt es mir noch besser, weil die Größe der Datei mit reinfließt. Und jetzt die Anleitungen für alle, die so gar keine Ahnung von Shell-Scripten haben, so wie ich :
Nimm einen Editor, z.B. kate
kopier den folgenden Text rein und passe ihn an Deine Verzeichnisse etc. an.



#!/bin/bash
wget -q -N http://rcswww.urz.tu-dresden.de/~es1792 ... s_2048.jpg -O /home/asmb/.xplanet/images/cloud_zwischen.jpg
filesize=`du ~/.xplanet/images/cloud_zwischen.jpg | cut -c 1-2`

if [ "$filesize" -ge 1 ]; then
cp ~/.xplanet/images/cloud_zwischen.jpg ~/.xplanet/images/cloud.jpg
#echo wget ERFOLGREICH
#else
#echo wget nicht erfolgreich
fi


speichere Datei unter name. Dann führe den Befehl chmod +x name, der macht eine ausführbare Datei. Das muss nur einmal gemacht werden. Ausgeführt wird name dann mit ./name

Um das Programm regelmäßig zu starten, verwende z.B. crontab.

Benutzeravatar
jochen
prolinux-forum-admin
Beiträge: 699
Registriert: 14. Jan 2000 15:37
Wohnort: Jülich
Kontaktdaten:

#6 Beitrag von jochen » 23. Sep 2005 21:01

Hi,

wenn Du es an der Dateigröße aufhängen willst, dann verwende doch einfach die Option -s (size) zum test-Kommando, dass Du beim if verwendest:

Code: Alles auswählen

if [ -s /home/asmb/.xplanet/images/cloud_zwischen.jpg ] ; then
    echo "Ich existiere und habe mind. 1 Byte Grösse."
else
    echo "Entweder es gibt mich nicht oder ich bin 0 Byte gross."
fi
Aber eigentlich ist auch das nur ein Umweg. Der direkteste und shellskript-typische Weg wäre

Code: Alles auswählen

if wget ... ; then
  mv quelle ziel
else
  echo wget hat nicht geklappt
fi
Nach "if" kommt ein ganz normales Kommando. if bewertet dessen Exitcode: 0 ist nach UNIX-Konvention "Alles OK", jeder andere Wert bedeutet "Irgendwas ging schief". Das "[" nach dem if, wie lateralus und Du es programmiert habt, ist in Wirklichkeit nur das test-Kommando - siehe "man test" bzw. "man bash" in der Sektion "CONDITIONAL EXPRESSIONS". Hier wird eben der Exitcode von wget bewertet, der bei Problemen auf 1 gesetzt wird, bei Erfolg gleich 0 - genau wie erwartet.

Jochen
Die grösste Lüge der EDV? "Mal eben..."

Benutzeravatar
fantaeiner
Beiträge: 53
Registriert: 31. Dez 2004 14:44
Kontaktdaten:

#7 Beitrag von fantaeiner » 24. Sep 2005 10:10

Erst einmal vielen Dank für Euer Bemühen!
Deine Idee scheint die einfachste zu sein, wenn es darum geht, herauszufinden, ob eine Dateigröße>0 ist.
Ich muss aber wissen, ob die Dateigröße>400kB ist, weil es manchmal Probleme beim Download gibt und ich nur "vollständige" cloud_zwischen.jpg zu cloud.jpg kopieren möchte . Deshalb fügte ich jetzt

filesize=`du ~/.xplanet/images/cloud_zwischen.jpg | cut -c 1-3`
#echo $filesize
if [ "$filesize" -ge 400 ]; then

ein. Das Problem:
wenn die Dateigröße sehr klein ist (<10kB, wie z.B. eine Datei mit 0 Byte). Dann kommt z.B. 9 / zurück (kein integer, Problem mit if). Das liegt an dem cut Befehl.
Gibts noch eine andere Möglichkeit als der Befehl du, die Dateigröße herauszufinden (als Ergebnis darf nur die Größe ausgegeben werden!)?

Gruß Fanta

Benutzeravatar
jochen
prolinux-forum-admin
Beiträge: 699
Registriert: 14. Jan 2000 15:37
Wohnort: Jülich
Kontaktdaten:

#8 Beitrag von jochen » 24. Sep 2005 15:31

Das Problem liegt nicht am du-, sondern am cut-Kommando! Mittels der Option "-c 1-3" schneidet cut aus der Eingabe die ersten drei Zeichen heraus. Statt dessen solltest Du ihm sagen, dass Dich das erste Feld interessiert:

Code: Alles auswählen

filesize=`du ~/.xplanet/images/cloud_zwischen.jpg | cut -f 1` 
Als Delimiter verwendet cut per Default Leerzeichen - das passt dann auch schon.

Wenn Du die exakte Anzahl Bytes haben willst, musst Du "ls -l" verwenden:

Code: Alles auswählen

ls -l ~/.xplanet/images/cloud_zwischen.jpg | awk '&#123;print $5&#125;'
Da cut jedes einzelne Leerzeichen als einen Feldtrenner sieht, wird es einfach zu unflexibel. Statt dessen sage ich dem etwas klügeren awk, dass mich das 5. Feld in der Ausgabe interessiert.

Jochen
Die grösste Lüge der EDV? "Mal eben..."

Benutzeravatar
fantaeiner
Beiträge: 53
Registriert: 31. Dez 2004 14:44
Kontaktdaten:

#9 Beitrag von fantaeiner » 24. Sep 2005 16:47

Danke, Jochen. Deine Idee ist einfach und klappt wunderbar. Darauf hätte ich eigentlich auch kommen können.

Gruß Fanta

Antworten