Обучение спам-фильтра и утилита find

Второй день сижу и пытаюсь понять почему это не работает. Разворачиваю понятие “это” – скрипт который очень активно скармливает нехорошие письма нашему спам-фильтру.  Надо обучить на немного не мало порядка 5К  письмах. А потом ещё 2.5К хороших, так сказать, для закрепления пройденного материала.

Пробуем отдельно командную строку:

mail02# cat /home/dronga/test/1274282843.M942069P44358.mail01.hat.ru,S=2504,W=2562:2,|/usr/local/bin/dspam –mode=teft –user odmin@hat.ru –class=spam –source=corpus –deliver=summary
X-DSPAM-Result: odmin@hat.ru; result=”Spam”;; probability=1.0000; confidence=1.00; signature=4bf4035b443567520620249

Отлично! Оборачиваем это дело в find примерно вот таким образом:

find . -type f -print – exec cat {}|/usr/local/bin/dspam –mode=teft –user odmin@hate.ru –class=spam –source=corpus –deliver=summary

Пробуем:

mail02# ./spam_learn.sh
/home/dronga/test/1274282843.M942069P44358.mail01.hat.ru,S=2504,W=2562:2,
find: cat /home/dronga/test/1274282843.M942069P44358.mail01.hat.ru,S=2504,W=2562:2,|/usr/local/bin/dspam –mode=teft –user odmin@hat.ru –class=spam –source=corpus –deliver=summary: No such file or directory
/home/dronga/test/1274288609.M452672P55446.mail01.hat.ru,S=1434,W=1476:2,
find: cat /home/dronga/test/1274288609.M452672P55446.mail01.hat.ru,S=1434,W=1476:2,|/usr/local/bin/dspam –mode=teft –user odmin@hat.ru –class=spam –source=corpus –deliver=summary: No such file or directory
/home/dronga/test/1274294629.M623575P66746.mail01.hat.ru,S=2356,W=2414:2,
find: cat /home/dronga/test/1274294629.M623575P66746.mail01.hat.ru,S=2356,W=2414:2,|/usr/local/bin/dspam –mode=teft –user odmin@hat.ru –class=spam –source=corpus –deliver=summary: No such file or directory
/home/dronga/test/1274301779.M6738P79179.mail01.hat.ru,S=9142,W=9327:2,
find: cat /home/dronga/test/1274301779.M6738P79179.mail01.hat.ru,S=9142,W=9327:2,|/usr/local/bin/dspam –mode=teft –user odmin@hat.ru –class=spam –source=corpus –deliver=summary: No such file or directory

И как это понимать?? Очевидно, что find отрабатывает, print есть, а вот по каким канонам разворачивается или не разворачивается exec  непонятно. Попробуем модифицировать:

/usr/local/bin/dspam –mode=teft –user odmin@hate.ru –class=spam –source=corpus –deliver=summary < {} \;

Тоже не работает. Аналогично и другие составные вариации. Между делом man find стал раздражать достаточно туманным пояснением работы опции exec в 2 вариантах (у меня FreeBSD 8). На тематичных форумах тоже решения не нашли, вроде как в самом find косяк. И exec_dir крутил и пути 100 раз проверил, с NFS тома выносил, кавычки, плюсики.. всё бесполезно, не работает. В общем, плюнул я на такое положение дел и сегодня на свежую голову пошел по “каноническому” пути.

-exec utility [argument ...] ;

Быстренько накидал sh-скрипт:

#!/bin/sh

/usr/local/bin/dspam –mode=teft –user odmin@hat.ru –class=$1 –source=corpus –deliver=summary < $2 ;

Следовательно, скрипт spam_learn.sh принял вид:

find /home/dronga/SPAM -type f -print -exec /home/dronga/learn.sh spam {} \;

Вот так заработало. Сейчас время буду засекать, имхо, секунд 30 займет. Но очень обидно, что не разворачиваются |, >, <. Вчерашний световой день вникуда, а сегодня за 10 минут вопрос решился. Бывают в жизни огорчения. Больше не наступайте на эти грабли! А штука получилась полезная, можно в короткие сроки обучить антиспам!

Leave a comment

Your comment

срочный ремонт ноутбуков спб Помочь такси в аэропорт микроавтобус автобусы.