lulu: shellscript // Dir.-listing mit Zeilenumbruch in Mail übernehmen

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>

!/bin/bash

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

--
bythewaythewebsuxgoofflineandenjoytheday
  1. 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

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

      --
      bythewaythewebsuxgoofflineandenjoytheday
      1. 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

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

          --
          bythewaythewebsuxgoofflineandenjoytheday
          1. Moin!

            Dann benutze ich jetzt doch eine temporäre Datei.

            Und warum schickst Du es nicht gleich per Pipe ins mailx?

            -- Skeeve

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

              --
              bythewaythewebsuxgoofflineandenjoytheday
              1. 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