Страница 1 из 1

sh выбрать все файлы за указанный период

Добавлено: 2009-10-22 16:24:46
Happy_demon
Доброе время.
есть папка, с большим количеством файликов, созданных в разное время, нужно скопировать файлы, созданные за определенный период.
т.е. вводим начальную дату, конечную и копируем в нужную папку все файлы, созданные за указанный период.
желательно скриптом, желательно на sh , но это опционально.
собственно это для почты. в постфикс, есть always_bcc, затем из его ящика все письма копируются в архив по папкам и вот нужно из папки пользователя выдернуть все письма отправленные/полученные , внутренние/внешние за определенный период

Код: Выделить всё

[root@base /usr/hand]# cat read.sh
#!/bin/sh
echo "Введите Фамилию пользователя"
read NAME
echo "Получено (in), Отправлено (out)?"
read ROUTE
echo "Нужны внутренние письма (1) или внешние(2)?"
read DESTINATION
echo "Введите начальную дату поиска писем в формате dd,mm,YY"
read DATE_START
echo "Ведите конечную дату поиска писем в формате dd,mm,YY"
read DATE_END
# Считываем фамилию пользователя и входящее это сообщение или исходящее
#а также - внутренне это сообщение, или внешнее
PREF="/usr/hand/mail"
#корень, откуда начинаем идти по почтовым ящикам
TOTAL="$PREF/$NAME/$ROUTE"
#конкретная папка , окуда будем всё копировать
cd $TOTAL
if [ "$DESTINATION" = 1 ]; then
# копируем нужные письма
    cp $(grep -l "^To: .*domen" *) $PREF/temp
else
    cp $(grep -L "^To: .*domen" *) $PREF/temp
fi
ну как-то так.
и выбранные письма копируются начальству в специально созданный почтовый ящик, они забирают все письма отдельным клиентом и уже в нем ищут нужное письмо. после того, как найдут всё что нужно - в почтовом клиенте очищаются папки до следующих поисков
т.к. писем м.б. ооооооочень много нужно обязательно период. потом, конечно добавим сортировку по размеру, выборку и удаление подтверждений о прочтении, но это потом. пока нужно вытащить все письма за указанный период.
заранее спасибо

Re: sh выбрать все файлы за указанный период

Добавлено: 2009-10-22 19:32:10
Гость
Happy_demon писал(а):нужно скопировать файлы, созданные за определенный период.
это можно сделать двумя способами: либо однострочником с помощью find(1) фильтруя по mtime письма, либо заглядывая внутрь писем и фильтруя по полю "Date:" или одному из "Received:" (время придется первести в секунды с начала эпохи). Например,

Код: Выделить всё

#! /bin/sh

start=$(date -v-1m '+%s') # a month ago
end=$(date '+%s')         # current date

date-extract() {
    local file=$1

    while read line; do
        case $line in
            [Dd]ate:\ * )
                line=${line#[Dd]ate: }
                date -jf '%a, %d %b %Y %H:%M:%S %z' "$line" +%s
        esac
    done < $file
}

for file; do
    date=$(date-extract $file)
    if [ $date -ge $start -a $date -le $end ]; then
        echo $file is whithin specified timerange
    fi
done

Код: Выделить всё

$ ./test.sh foo bar
bar is whithin specified timerange
так в каком месте у тебя вопросы?

Re: sh выбрать все файлы за указанный период

Добавлено: 2009-10-23 14:51:33
Happy_demon
так в каком месте у тебя вопросы?

Код: Выделить всё

[root@base /usr/hand]# sh qqq.sh qqq.sh select
[: -ge: unexpected operator
[: -ge: unexpected operator

Код: Выделить всё

[root@base /usr/hand]# uname -r
7.2-RELEASE
и если честно в скрипте мало что понятно. может, если не сложно
либо однострочником с помощью find(1)

Re: sh выбрать все файлы за указанный период

Добавлено: 2009-11-03 13:40:13
Happy_demon
в кои-то веки отписываюсь сам. вроде получилось. не совсем на shell но в принципе все работает

Код: Выделить всё

[root@bc ~]# cat read.sh
#!/bin/sh
echo "Введите Фамилию пользователя (полное имя имя@domen.ru)"
read NAME
echo "Получено (in), Отправлено (out)?"
read ROUTE
echo "Нужны внутренние письма (domen)(1) или внешние(2)?"
read DESTINATION
echo "Введите начальную дату поиска писем в формате YYYY-mm-dd"
read DATE_START
echo "Ведите конечную дату поиска писем в формате YYYY-mm-dd"
read DATE_END
CURRENT_DATE=`date "+%Y-%m-%d"`
# Считываем фамилию пользователя и входящее это сообщение или исходящее
#а также - внутренне это сообщение, или внешнее
PREF="/mnt/big/backup_mail/mail"
#корень, откуда начинаем идти по почтовым ящикам
TOTAL="$PREF/$NAME/$ROUTE"
#конкретная папка , откуда будем всё копировать
TEM="/mnt/big/temp"
#как можно догадаться из названия - временная папка
yday()
{
    perl -e '
        use POSIX qw(strftime);
        $fmt = "%j";  # %j day of year 1 - 366
        $mday = substr("$ARGV[0]", 8, 2);
        $mon =  substr("$ARGV[0]", 5 ,2);
        $year = substr("$ARGV[0]", 0 ,4);
        $weekday =
        strftime($fmt, 0, 0, 0, $mday , $mon - 1, $year - 1900, -1, -1, -1);
        print int $weekday;
            ' "$1"
}
#это какая-то сложная функция на перл для вычисления по дням
very_old=$( yday $DATE_START )
old=$( yday $DATE_END )
q=$( yday $CURRENT_DATE )
FULL_TIME=$(( $q - $very_old ))
# сколько дней от текущей даты до начала выборки
SMALL_TIME=$(( $q - $old ))
# сколько дней от текущей даты до конца выборки
cd $TOTAL

if [ "$ROUTE" = in ]; then
# копируем нужные письма
    if [ "$DESTINATION" = 1 ]; then
    cp -p $(grep -l "^From: .*domen" *) $TEM
        else
    cp -p $(grep -L "^From: .*domen" *) $TEM
    fi
else
if [ "$DESTINATION" = 1 ]; then
    cp -p $(grep -l "^To: .*domen" *) $TEM
        else
    cp -p $(grep -L "^To: .*domen" *) $TEM
    fi
fi
find $TEM -mtime +$SMALL_TIME -mtime -$FULL_TIME -exec cp -p '{}' /var/spool/mail/watch@domen.ru/new/ ';'
#копируем в папку пользователя watch@domen.ru нужные письма с учётом введенных дат
rm $TEM/*
# очищаем временную папку
никаких защит от неправильно введенных значений, никаких проверок. чисто для себя
З.Ы. Конечно же сначала надо выбирать файлы по времени, а уже потом их грепать по регулярным выражениям, иначе cp или grep будет ругаться, что аргументов слишком много. Но и тогда на больших учётках, вполне возможно надо будет использовать ещё и xargs

Re: sh выбрать все файлы за указанный период

Добавлено: 2010-03-10 7:52:16
ccoll
Здравствуйте.
Не могли бы вы сказать, как у вас реализовано:

- есть always_bcc, затем из его ящика все письма копируются в архив по папкам.

Заранее спасибо.

Как у вас реализовано копирования в архив по папкам?
У вас вся почта лежит в одной папке, потом какой то скрипт выбирает эти письма и раскидывает по папкам(я так понимаю папки это пользователи (user.in user.out). Если не затруднит показать сам скрипт и т.д..

Re: sh выбрать все файлы за указанный период

Добавлено: 2010-03-10 15:03:26
Alex Keda
?

Re: sh выбрать все файлы за указанный период

Добавлено: 2010-03-10 15:12:39
ccoll
ccoll писал(а):Здравствуйте.
Не могли бы вы сказать, как у вас реализовано:

- есть always_bcc, затем из его ящика все письма копируются в архив по папкам.

Заранее спасибо.
Как у вас реализовано копирования в архив по папкам?
У вас вся почта лежит в одной папке, потом какой то скрипт выбирает эти письма и раскидывает по папкам(я так понимаю папки это пользователи (user.in user.out). Если не затруднит показать сам скрипт и т.д..

Re: sh выбрать все файлы за указанный период

Добавлено: 2010-03-10 17:25:34
Alex Keda

Код: Выделить всё

# routing for 'input' mailbox
user_input:
        driver          = redirect
        local_parts     = input
#       data            = /mail/archive/input/${length_10:$tod_log}/${lc:$recipients}/$message_exim_id.eml
        data            = /mail/archive/input/${length_10:$tod_log}/${address:${lc:$h_X-mail-to:}}/$message_exim_id.eml
        file_transport  = address_file

# routing for 'output' mailbox
user_output:
        driver          = redirect
        local_parts     = output
        data            = /mail/archive/output/${length_10:$tod_log}/${lc:$sender_address}/$message_exim_id.eml
        file_transport  = address_file

viruses:
        driver          = redirect
        local_parts     = viruses
        data            = /mail/archive/viruses/${length_10:$tod_log}/$message_exim_id.eml
        file_transport  = address_file
:-D

Re: sh выбрать все файлы за указанный период

Добавлено: 2010-03-11 6:41:12
ccoll
Можно по подробней?