Hinweis: Das Forum wird geschlossen! Neue Registrierungen sind nicht mehr möglich!

 Zurück zu Pro-Linux   Foren-Übersicht   FAQ     Suchen    Mitgliederliste
wget erzeugt 0 Byte Dateien!?

 
Neuen Beitrag schreiben   Auf Beitrag antworten    Pro-Linux Foren-Übersicht -> Software
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
fantaeiner



Anmeldungsdatum: 31.12.2004
Beiträge: 53

BeitragVerfasst am: 23. Sep 2005 15:24   Titel: wget erzeugt 0 Byte Dateien!?

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
 
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen

Lateralus
prolinux-forum-admin


Anmeldungsdatum: 05.05.2004
Beiträge: 1238

BeitragVerfasst am: 23. Sep 2005 17:34   Titel:

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:
#!/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
 
Benutzer-Profile anzeigen Private Nachricht senden

fantaeiner



Anmeldungsdatum: 31.12.2004
Beiträge: 53

BeitragVerfasst am: 23. Sep 2005 18:58   Titel:

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/~es179238/clouds_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.
 
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen

Lateralus
prolinux-forum-admin


Anmeldungsdatum: 05.05.2004
Beiträge: 1238

BeitragVerfasst am: 23. Sep 2005 19:37   Titel:

Code:

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).
 
Benutzer-Profile anzeigen Private Nachricht senden

fantaeiner2
Gast





BeitragVerfasst am: 23. Sep 2005 19:48   Titel: so gehts

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/~es179238/clouds_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.
 

jochen
prolinux-forum-admin


Anmeldungsdatum: 14.01.2000
Beiträge: 699
Wohnort: Jülich

BeitragVerfasst am: 23. Sep 2005 21:01   Titel:

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:
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:
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..."
 
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen

fantaeiner



Anmeldungsdatum: 31.12.2004
Beiträge: 53

BeitragVerfasst am: 24. Sep 2005 10:10   Titel:

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
 
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen

jochen
prolinux-forum-admin


Anmeldungsdatum: 14.01.2000
Beiträge: 699
Wohnort: Jülich

BeitragVerfasst am: 24. Sep 2005 15:31   Titel:

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:
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:
ls -l ~/.xplanet/images/cloud_zwischen.jpg | awk '{print $5}'
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..."
 
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen

fantaeiner



Anmeldungsdatum: 31.12.2004
Beiträge: 53

BeitragVerfasst am: 24. Sep 2005 16:47   Titel:

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

Gruß Fanta
 
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen

Beiträge vom vorherigen Thema anzeigen:   
     Pro-Linux Foren-Übersicht -> Software Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehen Sie zu:  

Powered by phpBB © phpBB Group
pro_linux Theme © 2004 by Mandaxy