wget erzeugt 0 Byte Dateien!?

Software besorgen und anwenden
Post Reply
Message
Author
User avatar
fantaeiner
Posts: 53
Joined: 31. Dec 2004 14:44
Contact:

wget erzeugt 0 Byte Dateien!?

#1 Post by fantaeiner »

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

User avatar
Lateralus
prolinux-forum-admin
Posts: 1238
Joined: 05. May 2004 7:35

#2 Post by Lateralus »

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: Select all

#!/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

User avatar
fantaeiner
Posts: 53
Joined: 31. Dec 2004 14:44
Contact:

#3 Post by fantaeiner »

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.

User avatar
Lateralus
prolinux-forum-admin
Posts: 1238
Joined: 05. May 2004 7:35

#4 Post by Lateralus »

Code: Select all

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 Post by fantaeiner2 »

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.

User avatar
jochen
prolinux-forum-admin
Posts: 699
Joined: 14. Jan 2000 15:37
Location: Jülich
Contact:

#6 Post by jochen »

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: Select all

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: Select all

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..."

User avatar
fantaeiner
Posts: 53
Joined: 31. Dec 2004 14:44
Contact:

#7 Post by fantaeiner »

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

User avatar
jochen
prolinux-forum-admin
Posts: 699
Joined: 14. Jan 2000 15:37
Location: Jülich
Contact:

#8 Post by jochen »

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: Select all

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: Select all

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..."

User avatar
fantaeiner
Posts: 53
Joined: 31. Dec 2004 14:44
Contact:

#9 Post by fantaeiner »

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

Gruß Fanta

Post Reply