PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bash 2 Verzeichnisse in for-Schleife verarbeiten



Andy1988
07-05-2008, 10:29
Moin,
Ich versuch mir grade ein Script zu schreiben, dass auf meinem Mailserver ein mal am Tag durch eine gegebene Mailbox huscht und einen Report über alle vorhandenen Spam- und/oder Virenmails erzeugt und diesen per Mail an die entsprechende Adresse schickt.

Jetzt will ich mit einer for-Schleife durch alle Mails iterieren, die jedoch im entsprechenden Unterordner "cur" oder "new" liegen können.
Wie kann ich mit einer Schleife durch beide Verzeichnisse iterieren?

Ich habe bereits ein "ls $MAILDIR/.$TYPE/{cur, new}" probiert, was nicht funktioniert:

webserver ~ # ./mailreport.sh blubb bla@blubb.de Spam
ls: cannot access /var/customers/mail/blubb/bla@blubb.de//.Spam/{cur,: No such file or directory
ls: cannot access new}: No such file or directory

Und "ls $MAILDIR/.$TYPE/cur $MAILDIR/.$TYPE/new" gibt leider zusätzlich noch an, aus welchem der beiden Verzeichnisse die Dateien kommen. Das interessiert mich in dem Fall aber überhaupt nicht.

Hat jemand ne Idee?

Bisheriger Code:

#!/bin/bash

SYSCPUSER=$1
MAILBOX=$2
TYPE=$3
MAILDIR="/var/customers/mail/$SYSCPUSER/$MAILBOX/"

if [ -z $SYSCPUSER ] || [ -z $MAILBOX ] || [ "$TYPE" != "Virus" ] && [ "$TYPE" != "Spam" ]; then
echo "mailreport.sh <syscpuser> <mailaddress> <Virus|Spam>"
exit 1
fi

for mail in `ls $MAILDIR/.$TYPE/{cur, new}`; do
echo $mail
done

peschmae
07-05-2008, 10:38
Nuja, halt beide hinschreiben:

for mail in `ls $MAILDIR/.$TYPE/cur $MAILDIR/.$TYPE/new`; do

MfG Peschmä

ContainerDriver
07-05-2008, 12:43
Hallo.

@Andy1988: mach mal das Leerzeichen nach dem Komma in den geschweiften Klammern raus (also


ls $MAILDIR/.$TYPE/{cur,new}
).

@peschmae: die Lösung hat Andy1988 auch schon probiert, das funktioniert aber nicht so richtig, weil da auch die Verzeichnisnamen angezeigt werden.

Gruß, Florian

Andy1988
07-05-2008, 16:58
Danke, da ist leider dasselbe Problem, wie mit den kompletten Pfaden:

/var/customers/mail/blubb/bla@blubb.de//.Spam/cur:
1210151325.M173138P13027V0000000000000806I000C89CC _0.webserver,S=7040:2,
1210151325.M223139P13027V0000000000000806I000C89CE _1.webserver,S=11328:2,
1210151325.M633145P13027V0000000000000806I000C89D0 _2.webserver,S=11689:2,
1210151325.M973150P13027V0000000000000806I000C89D2 _3.webserver,S=7041:2,
1210151326.M253154P13027V0000000000000806I000C89D3 _4.webserver,S=6726:2,
1210151327.M353171P13027V0000000000000806I000C89D5 _6.webserver,S=11251:2,
1210151327.M43166P13027V0000000000000806I000C89D4_ 5.webserver,S=4095:2,
1210151327.M673175P13027V0000000000000806I000C89D6 _7.webserver,S=11098:2,
1210151328.M353186P13027V0000000000000806I000C89D7 _8.webserver,S=5905:2,
1210151329.M203199P13027V0000000000000806I000C89DB _9.webserver,S=6546:2,
1210151329.M983210P13027V0000000000000806I000C89DA _10.webserver,S=5642:2,
1210151330.M853223P13027V0000000000000806I000C89DC _11.webserver,S=7634:2,
1210151331.M673236P13027V0000000000000806I000C89E0 _12.webserver,S=11479:2,
1210151333.M883269P13027V0000000000000806I000C89E2 _13.webserver,S=11182:2,
1210151333.M913270P13027V0000000000000806I000C89E4 _14.webserver,S=7031:2,S
/var/customers/mail/geekatwork/andy@geekatwork.de//.Spam/new:

In new ist jetzt halt nichts drin, deswegen folgt danach nichts mehr.
Ich glaub ich prüf einfach, ob das erste Zeichen ein / ist und verarbeite die Zeile nicht. Macht am wenigstens Aufwand.
Was anderes fällt mir jetzt grade nicht ein.

WeenerChild
07-05-2008, 17:50
find eventuell?


for file in `find $MAILDIR/.$TYPE/{cur,new} -maxdepth 1 -type f`; do
echo $file
done
Gibt dir auch schön einen verwendbaren (relativen) Pfad an. Willst du den loswerden, siehe basename.

ContainerDriver
07-05-2008, 19:03
Danke, da ist leider dasselbe Problem, wie mit den kompletten Pfaden:


Oh :o
Hätte ich mir gleich denken können...

Andy1988
07-05-2008, 19:20
find eventuell?


Juhu! Herzlichen Dank. Is vielleicht so das 3. komplexere Shellscript das ich schreibe.
Da bin ich gar nicht drauf gekommen an einen anderen Befehl zu denken, der mir Dateien listen kann.

peschmae
08-05-2008, 07:08
@peschmae: die Lösung hat Andy1988 auch schon probiert, das funktioniert aber nicht so richtig, weil da auch die Verzeichnisnamen angezeigt werden.


Stimmt, ich wollte ursprünglich auch gar nicht das schreiben sondern ein


for mail in `ls $MAILDIR/.$TYPE/cur` `ls $MAILDIR/.$TYPE/new`; do

dann hab ich im letzten Moment natürlich noch gedacht "äh, wozu denn zweimal ls aufrufen?" ;)

MfG Peschmä

jan61
15-05-2008, 22:25
Moin,




ls $MAILDIR/.$TYPE/{cur,new}


Wieso nicht einfach
ls $MAILDIR/.$TYPE/{cur,new}/*?

Jan

EDIT: Der GNU-find liefert Dir übrigens noch eine viel bequemere Lösung:
find $MAILDIR/.$TYPE/{cur,new} -type f -maxdepth 1 -printf "%f\n"Schwupps - schon hast Du nur die Dateinamen ohne Pfad.