フルモデレートなMLで、保留メールが溜まるところは、/usr/local/mailman/data/heldmsg-ML_Name
/usr/local/mailman/data/heldmsg-tfc-9656.pck
1メール1ファイルになってて、こんな・・・
-rw-rw-r-- 1 mailman mailman 3831 Jan 11 08:22 heldmsg-tfc-9662.pck -rw-rw-r-- 1 mailman mailman 10554 Jan 11 11:17 heldmsg-tfc-9663.pck -rw-rw-r-- 1 mailman mailman 2634 Jan 11 11:19 heldmsg-tfc-9664.pck -rw-rw-r-- 1 mailman mailman 2250 Jan 11 11:21 heldmsg-tfc-9665.pck
で、特定の文字列を含むファイルを特定して、取り出して、内容編集した後特定のアドレスへ送信したい。
http://perl.g.hatena.ne.jp/ishiduca/20090827/1251379550
$ perl -wnl -e '/pattern/ and print $ARGV and close ARGV;' * $ perl -wnl -e '/tfc/ and print $ARGV and close ARGV;' *
上記のワンライナーで「pattern」を含むテキストファイルをリストアップできる。これをベースにして、patternを含まない場合や、検索するファイルの範囲を絞ったりする事もできるが、結構頻繁に使うので汎用的なスクリプトを書いてみた。
#!/usr/bin/perl -0777 -s -wnl use strict; our($a,$un,$h); our $reg; BEGIN{ my $help =<<"HELP"; Usage: $0 -h $0 [-a|-un] pattern [file] -a : include directory entries whose names begin with a dot(.) -un : not match -h : help pattern : use Regular Expression. file : use Regular Expression. HELP ; @ARGV or warn "$help\n" and exit 31; $reg = shift @ARGV; defined $reg and $reg ne '' or warn "$help\n" and exit 27; my @Files = $a ? <.* *> : <*>; $ARGV[0] and @Files = grep{ /$ARGV[0]/i }@Files; @ARGV = grep{ -f and -T }@Files; @ARGV or warn "$help\n" and exit 31; @ARGV = sort @ARGV; } if( $un ){ /$reg/ism or print "$ARGV\n" and close ARGV; } else { /$reg/ism and print "$ARGV\n" and close ARGV; } END { exit 0; }
$ perl ffpl 牛丼 travel$
とする逆に「牛丼」を含まない場合は
$ perl ffpl -un 牛丼 travel$
引数の指定に正規表現を使っているから表現がスマートじゃないのと、重いのが難点ですね。