[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Mal wieder find...



Hallo,

mein urspruengliches find-Problem ist zwar mittlerweile geloest worden; allerdings haenge ich jetzt wieder fest und bleibe daher gleich hier im Thread. :-)

Mit -exec oder auch -print0 | xargs kann man ja veranlassen, dass fuer die von find gefundene Datei ein Kommando ausgefuehrt wird. Ich wollte jetzt gleich mehrere Kommandos ausfuehren; habe zwar allerlei Verrenkungen gemacht, aber irgendwie funktioniert das alles nicht so, wie ich es mir vorgestellt habe. Ist das ueberhaupt moeglich?

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

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

find . -maxdepth 1 -type f -exec cat \{\} | formail -s procmail; mv mist \{\}.new \;

ergibt
find: missing argument to `-exec'
mv: missing file argument

Auch nach bash-Regeln gueltige Listenkonstrukte funktionieren nicht:
find . -maxdepth 1 -type f -exec { cat "{}" | formail -s procmail; mv mist "{}.new"; } \;
bash: syntax error near unexpected token `}'

Und
find . -maxdepth 1 -type f -exec \{ cat "{}" | formail -s procmail; mv mist "{}.new"; \} \;
find: missing argument to `-exec'
mv: cannot stat `mist': No such file or directory
bash: }: command not found

Sowie:
find . -maxdepth 1 -type f -exec "{ cat {} | formail -s procmail; mv mist {}.new; }" \; find: { cat ./header | formail -s procmail; mv mist ./header.new; }: No such file or directory

Darauf habe ich dann eine Shell-Funktion definiert:
prune() {
   cat "$1" | formail -s procmail
   mv mist "$1.new"
}

Der Aufruf dieser Funktion aus find funktioniert nicht:
find . -maxdepth 1 -type f -exec prune {} \;
find: prune: No such file or directory

Das liegt wohl daran, dass -exec eine eigene Shell oeffnet, in der prune nicht definiert ist. Also im naechsten Schritt:

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


Jetzt bin ich mit meinem Latein am Ende und dankbar fuer jeden Hinweis. :-)

Schoenen Gruss,

Andreas



Reply to: