URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 54499
[ Назад ]

Исходное сообщение
"Kak сделать split на mbox"

Отправлено Sasha , 16-Мрт-05 12:13 
HI all.
Есть задача из /var/mail/my_inbox стелать в конкретной директории кучу файлов - ровно столько сколько у меня в боксе писем.
Есть ли для этого стандарный способ ?

Содержание

Сообщения в этом обсуждении
"Kak сделать split на mbox"
Отправлено Lisa , 16-Мрт-05 12:19 
>HI all.
>Есть задача из /var/mail/my_inbox стелать в конкретной директории кучу файлов - ровно
>столько сколько у меня в боксе писем.
>Есть ли для этого стандарный способ ?
если ваша почта: mail
если чужая: mail -f /var/mail/my_inbox

косанда mail:
s 2 mybox1 - записать второе сообщение в файл mybox1
d 2 - удалить второе сообщение
q - выход
x - выход и восстановление удаленных сообщений



"Kak сделать split на mbox"
Отправлено Sasha , 16-Мрт-05 12:33 
>>HI all.
>>Есть задача из /var/mail/my_inbox стелать в конкретной директории кучу файлов - ровно
>>столько сколько у меня в боксе писем.
>>Есть ли для этого стандарный способ ?
>если ваша почта: mail
>если чужая: mail -f /var/mail/my_inbox
>
>косанда mail:
>s 2 mybox1 - записать второе сообщение в файл mybox1
>d 2 - удалить второе сообщение
>q - выход
>x - выход и восстановление удаленных сообщений
Мне нужно мемного другое ...
мой маилбох содержит к примеру 50 писем.
Я хочу обработав его на выходе в директории ( к примеру) /tmp/xxx получить файлы
xxx1
xxx2
....
xxx50
Где в каждом файле содержится по одному сообщению



"Kak сделать split на mbox"
Отправлено allez , 16-Мрт-05 12:52 
#!/bin/bash
declare -i I=0
while read STRING;
do
  [ "`echo $STRING | egrep '^From\ '`" != "" ] && I=$I+1
  echo $STRING >> /tmp/xxx$I
done < inbox

"Kak сделать split на mbox"
Отправлено Sasha , 16-Мрт-05 12:58 
>#!/bin/bash
>declare -i I=0
>while read STRING;
>do
>  [ "`echo $STRING | egrep '^From\ '`" != "" ]
>&& I=$I+1
>  echo $STRING >> /tmp/xxx$I
>done < inbox
Hmm !!!!
И то верно ...
THX Большой

"Kak сделать split на mbox"
Отправлено Sasha , 16-Мрт-05 13:09 
>THX Большой
hmm только он таб и * в недере меняет на список файлов в директории :(



"Kak сделать split на mbox"
Отправлено allez , 16-Мрт-05 13:26 
>>THX Большой
>hmm только он таб и * в недере меняет на список файлов
>в директории :(

Тогда возьмите имя переменной в кавычки:
echo "$STRING" >> /tmp/xxx$I


"Kak сделать split на mbox"
Отправлено Als , 16-Мрт-05 15:26 
Лежало вместе с Spamassassin

#!/usr/bin/perl -w

# mboxsplit - split a mailbox into separate files
#
# <@LICENSE>
# Copyright 2004 Apache Software Foundation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# </@LICENSE>

my $prog = $0;
$prog =~ s@.*/@@;

use vars qw($opt_h $opt_f $opt_i $opt_n);
use Getopt::Std;
getopts("hf:in:");

sub usage {
    my $status = shift;

    my $out = $status ? STDERR : STDOUT;
    print $out <<EOF;
usage: $prog [options] [mbox folders]

-h         print this help
-f format  set printf string to format
-i         ignore leading data until reaching mbox separator
-n n       set initial sequence number to n

mboxsplit splits mbox folders into separate files.  If no mbox folders
are specified, standard input is used.

"format" is a string formatted using the sprintf format used by Perl.
It should include a "%d" or other integer directive which will be
replaced by a sequence number (starting with 1 and counting upwards).
The default is "%d".

EOF
    exit($status);
}

usage(0) if $opt_h;

if (! $opt_f) {
    $opt_f = "%d";
}

my $file_no = defined($opt_n) ? $opt_n - 1 : 0;
my $file_open = 0;

while ($line = <>) {
    if ($file_open == 1 && $line =~ /^From /) {
        close(OUTFILE);
        $file_no++;
        $file_open = 0;
    }
    if ($file_open == 0) {
        if ($file_no == 0) {
            next if $opt_i && $line !~ /^From /;
            $file_no++;
        }
        open(OUTFILE, '>' . sprintf($opt_f, $file_no));
        $file_open = 1;
    }
    print OUTFILE $line;
}

if ($file_open == 1) {
    close(OUTFILE);
}