shellscript // Dir.-listing mit Zeilenumbruch in Mail übernehmen
lulu
- programmiertechnik
Huhu,
ich bastel gerade an einem Shell-Script und bekomme folgendes nicht hin:
Es soll eine Dateiliste per E-Mail verschickt werden.
Das klappt soweit auch, aber die Liste der Dateien soll in der E-Mail natürlich durch Zeilenumbrüche getrennt werden.
So sieht mein aktueller Versuch aus:
<code>
Recipient=myMail@example.org
MySqlDataDirectory=/opt/mysql/data/doomed_tables/
WarnList=find $MySqlDataDirectory -type f -ctime -7
MailTemplate="Hier kommt eine lange Liste:\n\n $WarnList "
echo $MailTemplate |
mailx -s "hostname
// Filelist" $Recipient
exit
</code>
Damit kommt schonmal die E-Mail, aber alle Dateinamen ($WarnList) stehen in der Mail hintereinander, durch ein Leerzeichen getrennt.
Habe diverse Konstruktionen der Art
<code>
WarnList=find $MySqlDataDirectory -type f -ctime -$MinAge | sed 's/[[:space:]]/\\\n/'
</code>
probiert aber bisher ohne Erfolg.
Eine temporäre Datei will ich eigentlich nicht erzeugen das wäre immerhin eine Lösung die mir noch einfällt.
Sollte doch irgendwie einfacher zu lösen sein oder?
Über einen Schubser in die richtige Richtung oder meinetwegen auch Schläge mit dem Zaunpfahl freut sich
lulu
Moin!
Ich denke, das liegt daran, daß als Zeilenende von find nicht \x0d\x0a sondern nur eines von beiden ausgegeben wird. \x0d\x0a ist aber der Standard in Internetanwendungen, wenn man perldoc perlipc vertrauen darf (>>The Internet line terminator is "\015\012"<<)
Versuch es mal mit
find ... -print0 | perl -pe 's/\x00/\x0d\x0a/g;'
Das geht sicher auch mit sed, aber da ich das nie verwende, weiß ich da nicht die Syntax für.
Wenn -print0 in Deinem find eine unbekannte option ist, sollte es auch das hier tun:
find ... | perl -pe 'chomp;$_.="\x0d\x0a";'
-- Skeeve
Hi,
Danke schonmal.
Aktuell bin ich noch am rumprobieren.
Also folgendes funktioniert:
find /opt/mysql/data/doomed_tables/ -type f -ctime -7 > liste
cat liste | mailx -s "hostname
// Filelist" MyMail@example.org
oder direkt
find /opt/mysql/data/doomed_tables/ -type f -ctime -7 | mailx -s "hostname
// Filelist" MyMail@example.org
alles prima, hier habe ich Zeilenumbrüche.
So klappt es nicht:
dummy=cat liste
echo $dummy | mailx -s "hostname
// Filelist" MyMail@example.org
hier sind die Umbrüche "verloren gegangen".
Offenbar geht es schief sobald man den Kram in eine Variable steckt.
Aber wieso, weshalb, warum?
Naja, so wichtig ist es auch nicht - aber irgendwann komme ich schon noch dahinter ;-)
Viele Grüße
lulu
Moin!
hier sind die Umbrüche "verloren gegangen".
Offenbar geht es schief sobald man den Kram in eine Variable steckt.
Aber wieso, weshalb, warum?
man sh oder ma bash:
Bash performs the expansion by executing command and replacing the com-
mand substitution with the standard output of the command, with any
trailing newlines deleted. Embedded newlines are not deleted, but they
may be removed during word splitting.
-- Skeeve
Hi Skeeve
Aber wieso, weshalb, warum?
Embedded newlines are not deleted, but they
may be removed during word splitting.
Alles klar, Danke.
Dann benutze ich jetzt doch eine temporäre Datei.
Viele Grüße
lulu
Moin!
Dann benutze ich jetzt doch eine temporäre Datei.
Und warum schickst Du es nicht gleich per Pipe ins mailx?
-- Skeeve
Hi,
Und warum schickst Du es nicht gleich per Pipe ins mailx?
es soll noch ein wenig erläuternder Text mit dazu, also nicht nur eine "nackte" Liste enthalten damit es eine "richtige" E-Mail wird.
Und es sollen zwei unterschiedliche find-Ergebnisse aufgeführt werden.
Vielleicht kann man das auch direkt zusammenpipen im Moment denke ich aber, dass es mit Hilfe einer tmp-Datei übersichtlicher und einfacher ist.
Viele Grüße
lulu
Moin!
Vielleicht kann man das auch direkt zusammenpipen im Moment denke ich aber, dass es mit Hilfe einer tmp-Datei übersichtlicher und einfacher ist.
Klar kann man das
(
echo <<'MAILTEXT'
Hallo Lulu!
Was haeltst Du denn hiervon?
MAILTEXT
find irgendwas
echo <<'Now4somethingCompletelyDiffernt'
Aber nun zu was ganz anderem:
Now4somethingCompletelyDiffernt
find was anderes
) | mailx ...
-- Skeeve