Re: Mal wieder find...
On 2004.02.29 16:10, Jan Trippler wrote:
Am Sonntag, 29. Februar 2004 11:30 schrieb Andreas Schmidt:
[...]
> Im konkreten Fall ging es darum, in einem Verzeichnis aus allen
> Mailboxen bestimmte Header zu entfernen. Ich hatte dafuer eine
> provisorische ~/.procmailrc angelegt (da die Mails ja schon
> sortiert
>
> waren, konnten die sonst faelligen Filter entfallen) :
> :0f
> :
> | formail -f -I Received: -I Envelope-to: -I Delivered-To:
> |
> :0
> mist
Das schiebt die Mails doch in ein Postfach mist - und der liegt im
Verzeichnis $MAIL, oder?
Das ist es nicht...hab eben mal ein "touch /var/mail/mist" gemacht,
aendert aber nichts an der Fehlermeldung. Ebensowenig eine Aenderung
des Pfades zu "mist" ins aktuelle Verzeichnis...
> Ich wollte jetzt fuer jede gefundene Mailbox procmail aufrufen
> und die Datei "mist" umbenennen:
>
> find . -maxdepth 1 -type f -exec "cat {} | formail -s procmail;
> mv mist {}.new" \;
>
> Hier gibt es dann die Fehlermeldung:
> find: cat ./header | formail -s procmail; mv mist ./header.new:
> No such file or directory
s. o. - wahrscheinlich wird mist im aktuellen Verzeichnis nicht
gefunden.
Das ist richtig. Habe jetzt mal am Anfang der .procmailrc "VERBOSE=on"
gestellt und Logging aktiviert. Dann den Teil mit mv weggelassen:
find . -maxdepth 1 -type f -exec "cat {} | formail -s procmail" \;
find: cat ./header | formail -s procmail: No such file or directory
Die Logdatei wird nicht angelegt, was darauf hindeutet, dass formail
ueberhaupt nicht ausgefuehrt wird. Kann es sein, dass find den gesamten
String "cat ./header | formail -s procmail" als Dateinamen ansieht?
> find . -maxdepth 1 -type f -exec cat \{\} | formail -s procmail;
> mv mist \{\}.new \;
>
> ergibt
> find: missing argument to `-exec'
> mv: missing file argument
Jepp - da Du die Befehlefolge nicht quotest, wird nur der Teil:
cat \{\} für exec erkannt - und da fehlt eben das \; am Ende. Die
Pipe gehört hier schon nicht mehr zum find.
Ist nachvollziehbar. Aber wenn ich quote, wird der Dateiname nicht
gefunden...
> prune () { cat "$1" | formail -s procmail; mv mist "$1.new"; };
> export prune; find . -maxdepth 1 -type f -exec "prune {}" \;
> find: prune ./header: No such file or directory
Kann es sein, dass der Konstrukt "prune {}" als _ein_ Kommando
aufgefasst wird? Versuchs hier doch mal ohne "" - so wie oben.
prune() { cat $1 | formail -s procmail; }; export prune; find . -
maxdepth 1 -type f -exec prune {} \;
find: prune: No such file or directory
exec mag wohl keine Shell-Funktionen...
Ich glaube. mit einem Shell-Script statt einer Funktion hättest Du
weniger Sorgen.
War halt nur ein quick'n'dirty hack. :-) Aber Du hast recht, die
Funktion in ein Script gepackt wird ausgefuehrt. Und wenn man '"$1"'
mit '"$*"' ersetzt, werden sogar Dateinamen mit Leerzeichen richtig
erkannt. Letztlich sieht es also wohl danach aus, dass man find
wirklich nur ein einzelnes Kommando direkt ausfuehren lassen kann.
Aeusserst unpraktisch, wenn man in solchen Faellen jedesmal erst ein
eigenes Script schreiben muss...
Schoenen Gruss,
Andreas
Reply to: