Montie
Anmeldungsdatum: 18. Dezember 2007
Beiträge: 39
Wohnort: 07
|
Hallo. Ich möchte mir automatisch die Vorlesungsscripte, Übungen, etc. herunterladen. Ich hab recherchiert, dass wget das richtige für mich sei. Es sollen zu bestimmten Zeitpunkten oder bei Systemstart (mal sehen, so weit bin ich noch nicht) die Dateien ggf. aktualisiert werden. Ich könnte eine Stapelverarbeitungsdatei machen, in der jeder Ordner aktualisiert wird, habe mich aber dafür entschieden für jeden Ordner (und in jedem) selbst die Stapelverarbeitungsdatei unterzubringen, weil ich sie dann einfacher speziell nochmal ausführen kann und das auch, wenn ich den Ordner verschoben habe. Der Plan also: Es gibt eine SVDatei die die SVDateien aus den Modulordnern aufruft. Ich hab es weitestgehend geschafft die SVDateien für die Modulordner mit dem wget-Befehl zu erstellen.
Ich habe sie ausführbar gemacht. (Wird auch grün mit ls angezeigt). 1. Ich habe gelesen, man solle #!/bin/sh in die erste Zeile schreiben. Warum? 2. Ich kann die SVDateien nicht einfach per Doppelklick ausführen. Warum? 3. Im Terminal kann ich die SVDateien nicht einfach mit dem Aufruf "svdatei-modul1.sh" ausführen. "bash: svdatei-modul1.sh: command not found" Bekomme ich zurück. ich muss es mit "sh svdatei-modul1.sh" machen. Warum?
In meiner SVDatei, die die anderen Dateien aufrufen soll, kann ich jedoch einfach "~/Studium/pfad-zur-datei/svdatei-modul1.sh" hineinschreiben und die beschriebene Datei wird dann ohne vorangestelltes sh ausgeführt. Warum? Vielen Dank
|
oxe1976
Anmeldungsdatum: 5. Februar 2008
Beiträge: 759
|
Montie schrieb: Hallo. Ich hab recherchiert, dass wget das richtige für mich sei.
Das ist schon mal richtig. Damit geht sowas eigentlich ganz gut. Ich könnte eine Stapelverarbeitungsdatei machen, in der jeder Ordner aktualisiert wird, habe mich aber dafür entschieden für jeden Ordner (und in jedem) selbst die Stapelverarbeitungsdatei unterzubringen, weil ich sie dann einfacher speziell nochmal ausführen kann und das auch, wenn ich den Ordner verschoben habe.
grrr ... der Begriff Script anstatt von Stapelverarbeitungsdatei passt besser ☺
1. Ich habe gelesen, man solle #!/bin/sh in die erste Zeile schreiben. Warum?
Das ist das Programm (shell) die dein Script interpretieren soll. Hier das Programm /bin/sh was bei Linux eigentlich immer die bash ist.
2. Ich kann die SVDateien nicht einfach per Doppelklick ausführen. Warum?
Wahrscheinlich werden die ausgeführt, allerdings landen die Ausgaben im Nirvana. Deine scripte sind ja keine X-Anwendungen die ein Fenster öffnen oder sowas.
3. Im Terminal kann ich die SVDateien nicht einfach mit dem Aufruf "svdatei-modul1.sh" ausführen. "bash: svdatei-modul1.sh: command not found" Bekomme ich zurück. ich muss es mit "sh svdatei-modul1.sh" machen. Warum?
In meiner SVDatei, die die anderen Dateien aufrufen soll, kann ich jedoch einfach "~/Studium/pfad-zur-datei/svdatei-modul1.sh" hineinschreiben und die beschriebene Datei wird dann ohne vorangestelltes sh ausgeführt. Warum?
Das liegt daran, dass das working directory (das directory in dem Du gerade bist) nicht in Deinem Suchpfad ist. Der Suchpfad ist eine Liste von Pfaden wo die Shell nach Programmen sucht. Der Suchpfad wird in der variable PATH gespeichert. Gib mal: echo $PATH ein, dann siehst Du Deinen Suchpfad. Du kannst das script mit ./svdatei-modul1.sh starten (vorrausgesetzt Du bist im richtigen Verzeichnis). Dann sollte es funktionieren, dann nimmt die Shell das Kommando aus ./ (Working directory).
Vielen Dank
Gruß
|
xabbuh
Anmeldungsdatum: 25. Mai 2006
Beiträge: 6411
|
oxe1976 schrieb: 1. Ich habe gelesen, man solle #!/bin/sh in die erste Zeile schreiben. Warum?
Das ist das Programm (shell) die dein Script interpretieren soll. Hier das Programm /bin/sh was bei Linux eigentlich immer die bash ist.
Davon würde ich absehen. /bin/sh ist unter Ubuntu ein Link auf /bin/dash. Möchtest du die Funktionen der Bash nutzen, solltest du das auch entsprechend mit #!/bin/bash angeben. Edit: Natürlich dash...
|
The-Compiler
Anmeldungsdatum: 21. April 2006
Beiträge: 2640
Wohnort: Winterthur, Schweiz
|
xabbuh schrieb: oxe1976 schrieb: 1. Ich habe gelesen, man solle #!/bin/sh in die erste Zeile schreiben. Warum?
Das ist das Programm (shell) die dein Script interpretieren soll. Hier das Programm /bin/sh was bei Linux eigentlich immer die bash ist.
Davon würde ich absehen. /bin/sh ist unter Ubuntu ein Link auf /bin/bash. Möchtest du die Funktionen der Bash nutzen, solltest du das auch entsprechend mit #!/bin/bash angeben.
Unter Ubuntu ist es seit Dapper Drake (glaub ich) nicht mehr bash sondern dash:
lrwxrwxrwx 1 root root 4 2008-10-30 18:56 /bin/sh -> dash* Flo
|
xabbuh
Anmeldungsdatum: 25. Mai 2006
Beiträge: 6411
|
The Compiler schrieb: xabbuh schrieb: oxe1976 schrieb: 1. Ich habe gelesen, man solle #!/bin/sh in die erste Zeile schreiben. Warum?
Das ist das Programm (shell) die dein Script interpretieren soll. Hier das Programm /bin/sh was bei Linux eigentlich immer die bash ist.
Davon würde ich absehen. /bin/sh ist unter Ubuntu ein Link auf /bin/bash. Möchtest du die Funktionen der Bash nutzen, solltest du das auch entsprechend mit #!/bin/bash angeben.
Unter Ubuntu ist es seit Dapper Drake (glaub ich) nicht mehr bash sondern dash: [...]
Argh, das meinte ich.
|
oxe1976
Anmeldungsdatum: 5. Februar 2008
Beiträge: 759
|
xabbuh schrieb: oxe1976 schrieb: 1. Ich habe gelesen, man solle #!/bin/sh in die erste Zeile schreiben. Warum?
Das ist das Programm (shell) die dein Script interpretieren soll. Hier das Programm /bin/sh was bei Linux eigentlich immer die bash ist.
Davon würde ich absehen. /bin/sh ist unter Ubuntu ein Link auf /bin/bash. Möchtest du die Funktionen der Bash nutzen, solltest du das auch entsprechend mit #!/bin/bash angeben.
Naja, der link ist da, damit /bin/sh funktioniert. Bei vielen UNIX'en gibs keine Bash (bzw. Dash), da gibs nur die gute alte Bourne-Shell (/bin/sh), die aber weitgehend kompatibel ist. D.h. möchtest Du das Dein script auch auf anderen Unix Systemen funktioniert, nehme /bin/sh ☺ ... aber ich denke das ist wurscht in diesem Fall.
Wenn Du spezielle Features von Bash oder Dash nutzt, dann sieht es natürlich anders aus.
|
Montie
(Themenstarter)
Anmeldungsdatum: 18. Dezember 2007
Beiträge: 39
Wohnort: 07
|
Vielen Dank für die flotten Antworten.
Ich hab recherchiert, dass wget das richtige für mich sei.
Das ist schon mal richtig. Damit geht sowas eigentlich ganz gut.
Trotz der Anweisung --reject .gif,.html,*.html\?*,*.txt wird immer die Datei robots.txt mit heruntergeladen. Weshalb? Hatte sogar mal --reject robots.txt geschrieben. Auch ohne Erfolg. Wie kann das sein? 2. Ich kann die SVDateien nicht einfach per Doppelklick ausführen. Warum?
Wahrscheinlich werden die ausgeführt, allerdings landen die Ausgaben im Nirvana. Deine scripte sind ja keine X-Anwendungen die ein Fenster öffnen oder sowas.
Ja tatsächlich, die Dateien werden heruntergeladen. Wie ich das vorher übersehen hab. Sorry. Ich wollte gerne irgendwie mitbekommen, wenn neue Dateien hinzukommen. Ich hab jetzt nur die Idee, die Log Dateien speichern zu lassen. --append-output=./wget.log aber da steht dann ja alles drinn. Gibt es eine Möglichkeit sich zeigen zu lassen, wenn sich etwas verändert hat? Eventuell mit cp? Du kannst das script mit ./svdatei-modul1.sh starten (vorrausgesetzt Du bist im richtigen Verzeichnis). Dann sollte es funktionieren, dann nimmt die Shell das Kommando aus ./ (Working directory).
Ja, das geht. Ich dachte, dass das ./ nicht nötig sei. Ist unter DOS so, wenn ich mich recht erinnere.
Danke.
|
oxe1976
Anmeldungsdatum: 5. Februar 2008
Beiträge: 759
|
Montie schrieb: Trotz der Anweisung --reject .gif,.html,*.html\?*,*.txt wird immer die Datei robots.txt mit heruntergeladen. Weshalb? Hatte sogar mal --reject robots.txt geschrieben. Auch ohne Erfolg. Wie kann das sein?
Ohne es jetzt getestet zu haben muss es wohl heissen: --reject gif,html,txt Ich wollte gerne irgendwie mitbekommen, wenn neue Dateien hinzukommen. Ich hab jetzt nur die Idee, die Log Dateien speichern zu lassen. --append-output=./wget.log aber da steht dann ja alles drinn. Gibt es eine Möglichkeit sich zeigen zu lassen, wenn sich etwas verändert hat? Eventuell mit cp?
Hm, was ganz einfaches fällt mir nicht ein. Du möchtest ja eher synchronisieren, statt einfach zu downloaden. Ich könnte mir vorstellen, dass Du immer erst in ein tmp Verzeichnis downloadest und Dein richtiges Verzeichnis mit den Dokumenten dann mit rsync und diesem tmp Verzeichnis synchronisierst. rsync sollte Dir zeigen was geändert wurde. Oder Du machst ein diff auf beide Verzeichnisse.
|
Sid_Burn
Anmeldungsdatum: 23. Oktober 2004
Beiträge: 2159
|
oxe1976 schrieb: Naja, der link ist da, damit /bin/sh funktioniert. Bei vielen UNIX'en gibs keine Bash (bzw. Dash), da gibs nur die gute alte Bourne-Shell (/bin/sh), die aber weitgehend kompatibel ist. D.h. möchtest Du das Dein script auch auf anderen Unix Systemen funktioniert, nehme /bin/sh ☺
Möchte man es portabel haben würde ich eher empfehlen Perl oder Python zu nehmen. Beide Sprachen sind ausgereift und haben eine große Community und viele Module. Beide Sprachen gehören zur LSB Spezifikation, daher auf Linux Systemen die LSB Konform sind sollte man beide Sprachen antreffen. Problem bei Shell Skripte ist halt noch das die Tools auf Unix/BSD unterschiedlich sind. Daher viele GNU Tools haben in der Regel mehr Switche die unter BSD nicht verfügbar sind, oder anders sind. Also nur darauf achten das es mit der dash läuft macht es noch nicht Portabel. Mit Perl oder Python musst du dich mit sowas nicht herumschlagen. Und ansonsten halte ich beide Sprachen für einfacher. Mittels bash/dash und paar tools eine "Mirror" Software aufzusetzen wo man dann wild irgendwelche Rückgaben von wget parsen muss halte ich eher für fehlerträchtig und zu komplex. Im Beispiel von Perl gibt es z.B. LWP::Simple das bereits eine "mirror()" Funktion anbietet und eine Datei herunterlädt. Und wenn sie schon vorhanden ist und nicht verändert wurde dann auch nichts herunterlädt. Aber zumindest kann man die rückgabe der Funktion einfach testen. | sidburn@sid:~$ perl -MLWP::Simple -wle 'print mirror("http://kernel.org/pub/software/scm/git/git-1.6.1.2.tar.bz2", "git.tar.bz2")'
200
sidburn@sid:~$ perl -MLWP::Simple -wle 'print mirror("http://kernel.org/pub/software/scm/git/git-1.6.1.2.tar.bz2", "git.tar.bz2")'
304
|
Der Status 304 (HTTP Status 304) steht hierbei für "NOT_MODIFIED" und beim zweiten mal wurde nichts mehr heruntergeladen. Sowas kann man leicht abfragen und sich dann eine entsprechende Liste der geupdateden Dateien aufbauen. Irgendwie erst alles in einem temp verzeichniss herunterladen und es bei jedem aufruf alles wieder komplett neu herunterzuladen und dann mit rsync zu synchronisieren und davon wieder die rückgabe zu parsen halt ich eher zum einen für eine total schwachsinnige Idee, und zum anderen wäre das im Bundeswehr Wortlaut eine Typische "Dummfick" aufgabe gewesen. Bzw. auf Deutsch "Das Generieren von unnötig viel Arbeit." Evtl. gibt es dafür aber ja auch schon fertige Software. Danach würde ich jedenfalls als erstes suchen. Ein paar Dateien zu Mirrorn sollte wohl nicht so eine seltene Aufgabe sein das sich da noch niemand dran gesetzt hat.
|
oxe1976
Anmeldungsdatum: 5. Februar 2008
Beiträge: 759
|
Sid Burn schrieb: oxe1976 schrieb: Irgendwie erst alles in einem temp verzeichniss herunterladen und es bei jedem aufruf alles wieder komplett neu herunterzuladen und dann mit rsync zu synchronisieren und davon wieder die rückgabe zu parsen halt ich eher zum einen für eine total schwachsinnige Idee, und zum anderen wäre das im Bundeswehr Wortlaut eine Typische "Dummfick" aufgabe gewesen. Bzw. auf Deutsch "Das Generieren von unnötig viel Arbeit."
Der Threadstarter hatte ja nun schon angefangen ein bash script zu basteln. Zugegeben, den Kram erst mal in temp herunterzuladen usw. ist sicherlich nicht effizient oder elegant. Aber das kriegt mal schnell und einfach in 2 Zeilen hin (weiss auch nicht warum irgendwelche Rueckgabewerte geparst werden sollen ... im rsync log sieht man eigentlich alles). Aber toll, das das mit anderen Programmiersprachen weitaus eleganter und toller geht ... Aber das hilft nicht wirklich weiter in einem konkreten Fall. Wann wird sicherlich immer erst versuchen die Sprache zu verwenden, die man am besten kann ... Gruss
|
Sid_Burn
Anmeldungsdatum: 23. Oktober 2004
Beiträge: 2159
|
oxe1976 schrieb: Der Threadstarter hatte ja nun schon angefangen ein bash script zu basteln. Zugegeben, den Kram erst mal in temp herunterzuladen usw. ist sicherlich nicht effizient oder elegant. Aber das kriegt mal schnell und einfach in 2 Zeilen hin (weiss auch nicht warum irgendwelche Rueckgabewerte geparst werden sollen ... im rsync log sieht man eigentlich alles).
Und der TE will ja eben nicht alles haben sondern nur das was sich verändert hat. Wenn er (ausgedacht) 2000 Dokumente synct möchte ich auch nicht jedesmal wissen das 1999 davon identisch geblieben sind. Ich Zitiere mal den TE, da du das anscheind überlesen hast.
Ich wollte gerne irgendwie mitbekommen, wenn neue Dateien hinzukommen. Ich hab jetzt nur die Idee, die Log Dateien speichern zu lassen. --append-output=./wget.log aber da steht dann ja alles drinn. Gibt es eine Möglichkeit sich zeigen zu lassen, wenn sich etwas verändert hat? Eventuell mit cp?
Zum anderen sagt er hier ja auch noch er möchte wissen "wenn neue Dateien hinzukommen" Daher hat er nichtmal eine Liste. Sondern er muss die Liste sich erstmal besorgen. Woher kommt die? Ist es eine webseite? Dann reicht nicht nur ein Aufruf sondern dann fangen wir an HTML auslesen und HTML Parsen an, wenn du sowas mal eben in bash machst... Leider ist die genaue Spezifikation vom TE was er wirklich machen möchte nicht genau definiert. Wenn es von FTP kommt da gibt es schon FTP Mirror programme. Er müsste also nochmals genauer schreiben was er überhaupt tuen möchte bisher geht das noch immer nicht genau hervor.
Aber toll, das das mit anderen Programmiersprachen weitaus eleganter und toller geht ... Aber das hilft nicht wirklich weiter in einem konkreten Fall. Wann wird sicherlich immer erst versuchen die Sprache zu verwenden, die man am besten kann ...
Da der Threadersteller nichtmal die grundlagen beherscht und fragt was ein #!/bin/sh am anfang macht, denke ich nicht das man hier davon reden kann das er irgendwas "am besten" kann. Ich denke auch mal das es dem TE volkommen egal sein wird "wie" es letztendlich funktioniert, hauptsache er hat eine Funktionierende Lösung. Und das ganze in Bash auf teufel komm raus zu machen wäre nicht meine Empfehlung. Und doch es hilft weiter im konkreten Fall. Der konkrete Fall ist das er von "irgendwo", "irgendwas" mirrorn möchte. Das ist der konkrete Fall. Bisher denkt er das "wget" dafür gedacht ist, dass muss aber nicht der Fall sein. Der TE sollte sein eigenliches Problem das er gelöst haben möchte nochmal erfragen und nicht seine eventuelle Lösung. Zum anderen wenn ich ein simples "apt-cache search mirror" eingebe kommen da schon evtl. brauchbare Ergebnisse heraus. Wenn ich nur mal drüber schauen könnte ja "omt", "httrack", "simba", "ftpmirror", "mirror", "mirmon" schon die aufgabe lösen. Bis auf httrack kenne ich die programme nicht. Die Programm zu testen und ob diese evtl. für ihn geeignet sind muss der TE aber selber vornehmen.
|
Montie
(Themenstarter)
Anmeldungsdatum: 18. Dezember 2007
Beiträge: 39
Wohnort: 07
|
Ich möchte mir automatisch die Vorlesungsscripte, Übungen, etc. herunterladen.
Genauer bedeutet das: DATEIEN:
Meine Professoren stellen Vorlesungsfolien, Scripte, Übungsaufgaben, Musterlösungen, etc. zum Download bereit.
Diese Dateien müssen nicht zwangsläufig pdf-Dateien sein. Es können auch ZIP oder ganz andere Dateien
sein. ORT:
Diese Dateien befinden sich auf den Webseiten der Professoren, die unterschiedlich aufgebaut sind.
Manche haben die mich betreffenden Dateien in einem Ordner, manche haben all ihre Dateien in einem Ordner. Die mich betreffenden muss man dann per Ausschlussverfahren anhand des Namens sieben.
FTP-Zugang ist meines Wissens nicht möglich.
Es gibt fast immer auch Html-Seiten, welche die Inhalte auflisten. PASSWORT:
Manche Seiten sind nicht Passwort geschützt, manche jedoch schon. Diese dann entweder per .htaccess, Cookie oder SessionID ICH WILL:
Ich möchte die mich betreffenden Dateien natürlich immer möglichst vollständig und aktuell heruntergeladen haben. PROBLEM:
Manchmal werden Dateien nach und nach freigegeben/auf der HTML-Seite angegeben/hochgeladen.
Manchmal werden Dateien verändert/aktualisiert. (Beispielsweise wenn ein Fehler in einer Folie war und die Folie korrigiert wurde.) Ich möchte nun nicht jeden Tag aufs neue alle Seiten aller meiner Professoren abklappern, die Login-Daten heraussuchen, mich anmelden, vergleichen ob es etwas neues gibt, oder ob sich etwas geändert hat.
Ich hätte es gerne automatisiert und würde gerne benachrichtigt werden, wenn sich eine Datei verändert hat oder eine neue Datei hinzu kommt, denn ich möchte ja damit arbeiten und es nicht einfach nur unbemerkt auf meiner Festplatte liegen haben. Ich möchte das natürlich so einfach wie möglich halten und nicht aufwendig viele/große Programme installieren. Portabel wäre ideal, da ich dann damit auch an anderen PCs arbeiten könnte und ich evtl. meinen PC wechseln werde. Jedes Semester ändern sich mit den Professoren natürlich auch die Bezugsquellen. Mit meiner WGET-Methode war es notwendig (bei dem Fall, dass auch mich nicht betreffende Dateien in dem Ordner sind) die falschen anhand des Namens heraus zu filtern. Ich habe das ausschlussverfahren bevorzugt um so notfalls lieber eine Datei zu viel als eine wichtige zu wenig herunter zu laden. Diese Filterregeln muss ich natürlich bestimmen und möglichst einfach eintragen können. Ich hoffe ich habe nichts wichtiges vergessen.
Danke.
|