Hallo, On Thu, 31 Jul 2003, Oliver Fuchs schrieb:
From: Bernd Tannenbaum <tannenbaum@service.itenos.de> [Outlook-Roman gekuerzt]
@Oliver: Die erste Zeile mit dem 'From: ' reicht.
Okay, hier meine funktionierend lösung fürs Archiv:
In einem Verzeichnis liegen die file(s) xxx, die nicht mit einem "." beginnen. Sie sollen per cronjob im Web downloadbar werden.
Mein cronjob führt folgendes Script aus:
/bin/rm /pfad/index.html /bin/ls /pfad | grep ^[^.] > /pfad/.body1 /bin/sed -e 's/$/">Download<\/a><br>/g' /pfad/.body1 > /pfad/.body2 /bin/sed -e 's/^/<a href="/g' /pfad/.body2 > /pfad/.body3 /bin/cat /pfad/.head > /pfad/index.html /bin/cat /pfad/.body3 >> /pfad/index.html /bin/cat /pfad/.end >> /pfad/index.html
Hm. Warum einfach, wenn's auch kompliziert geht? ;) ==== { /bin/cat /pfad/.head; /bin/ls /pfad | sed -e 's/.*/<a href="&">Download<\/a><br>/'; /bin/cat /pfad/.end; } > /pfad/index.html ==== (die ';' an den Zeilenenden sind in einem script nur noetig, wenn zwischen dem letzten Befehl im '{}' Block kein Zeilenumbruch folgt[1].) Hm. Eigentlich muss da ein 'ls /pfad | grep -v 'index\.html' | sed ..' hin ;) Naja, schadet ja nicht weiter, wenn sich index.html selbst referenziert ;) Anmerkungen: 1. durch die "Blockbildung" mittels '{ ...; }' (ohne eine subshell!) kann die gesamte Ausgabe der Befehle darin gemeinsam umgeleitet werden. 2. das 'rm' ist ueberfluessig, da die Datei eh ueberschrieben wird. 3. /bin/ls listet nur auf Befehl (-a/-A) auch .-Dateien. Zumindest wenn du /bin/ls so mit vollem Pfad aufrufst, ein grep -v '^\.' ist also ueberfluessig. 4. Was das '&' im RELACEMENT bedeutet siehe man sed: The replacement may contain the special character & to refer to that portion of the pattern space which matched, Mit der Regexp '.*' im PATTERN steht dort "alles", und das '&' ("alles was passt") enthaelt also die gesamte Zeile, also den Dateinamen. 5. die "schicke" Variante ist fast identisch: | /bin/sed -e 's/.*/<a href="&">Download &<\/a><br>/' hier wird einfach zweimal das '&' verwendet, in dem ja jew. der Dateiname steht. 6. wie man sieht ist die Loesung, die die Mittel der shell und die der anderen Tools richtig einsetzt IMO sogar die einfachste, da keinerlei "Verrenkungen" mehr noetig sind. Und ja, ich weiss aus eigener Erfahrung, dass es nicht leicht ist, eben dies zu tun, da hilft eigentlich nur viel (und genau) lesen und ueben, ueben, ueben und Beispiele nachvollziehen und konstruktive Kritik ;)
ich hab's ja nicht probiert, aber ich glaube auf der HTML-Seite steht dann nur mehrfach "Download". Es geht glaub' ich einfacher und schoener:
/bin/cat /pfad/.head > /pfad/index.html ls /pfad | grep ^[^.]
Useless use of grep (s.o.) und wenn dann waere ein grep -v '^\.\|^index.html$' sinnvoller. Und nebenbei: Argumente immer quoten!
| sed -e 's/^\(.*\)$/<a href="\1">Download \1<\/a><br>/g' \
Useless use of "backreference" (s.o.). Ansonsten gute Loesung. -dnh [1] Generell gilt: In scripten kann ein ';', das shell(!)-Befehle trennt, durch einen Zeilenumbruch ersetzt werden. Und vor einem '}' oder ')' eines '{}' oder '()' Blockes _ist_ ein solcher Trenner (';' oder Zeilenumbruch) notwendig. -- Hm. Libre electricity. "You may do anything you like with this electricity, including but not limited to application to lusers, provided that you pass on these rights to all subsequent users of this electricity." Wonder how that'd work... -- Stuart Lamble in asr, on '220V RMS.'