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

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Happy_demon
сержант
Сообщения: 194
Зарегистрирован: 2006-08-16 16:33:55
Откуда: Санкт-Петербург

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

Непрочитанное сообщение Happy_demon » 2009-10-22 16:24:46

Доброе время.
есть папка, с большим количеством файликов, созданных в разное время, нужно скопировать файлы, созданные за определенный период.
т.е. вводим начальную дату, конечную и копируем в нужную папку все файлы, созданные за указанный период.
желательно скриптом, желательно на 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
ну как-то так.
и выбранные письма копируются начальству в специально созданный почтовый ящик, они забирают все письма отдельным клиентом и уже в нем ищут нужное письмо. после того, как найдут всё что нужно - в почтовом клиенте очищаются папки до следующих поисков
т.к. писем м.б. ооооооочень много нужно обязательно период. потом, конечно добавим сортировку по размеру, выборку и удаление подтверждений о прочтении, но это потом. пока нужно вытащить все письма за указанный период.
заранее спасибо

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Гость
проходил мимо

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
так в каком месте у тебя вопросы?

Happy_demon
сержант
Сообщения: 194
Зарегистрирован: 2006-08-16 16:33:55
Откуда: Санкт-Петербург

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

Непрочитанное сообщение Happy_demon » 2009-10-23 14:51:33

так в каком месте у тебя вопросы?

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

[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)

Happy_demon
сержант
Сообщения: 194
Зарегистрирован: 2006-08-16 16:33:55
Откуда: Санкт-Петербург

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

Непрочитанное сообщение Happy_demon » 2009-11-03 13:40:13

в кои-то веки отписываюсь сам. вроде получилось. не совсем на 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

ccoll
проходил мимо
Сообщения: 7
Зарегистрирован: 2010-01-28 15:58:09

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

Непрочитанное сообщение ccoll » 2010-03-10 7:52:16

Здравствуйте.
Не могли бы вы сказать, как у вас реализовано:

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

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

Как у вас реализовано копирования в архив по папкам?
У вас вся почта лежит в одной папке, потом какой то скрипт выбирает эти письма и раскидывает по папкам(я так понимаю папки это пользователи (user.in user.out). Если не затруднит показать сам скрипт и т.д..
Последний раз редактировалось ccoll 2010-03-10 15:09:59, всего редактировалось 1 раз.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35411
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

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

Непрочитанное сообщение Alex Keda » 2010-03-10 15:03:26

?
Убей их всех! Бог потом рассортирует...

ccoll
проходил мимо
Сообщения: 7
Зарегистрирован: 2010-01-28 15:58:09

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

Непрочитанное сообщение ccoll » 2010-03-10 15:12:39

ccoll писал(а):Здравствуйте.
Не могли бы вы сказать, как у вас реализовано:

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

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

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35411
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

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

Непрочитанное сообщение Alex Keda » 2010-03-10 17:25:34

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

# 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
Убей их всех! Бог потом рассортирует...