LINUX.ORG.RU

Вывести имена папок в которых нет файлов за последние N дней

 ,


0

1

Всем доброго времени суток.

Подскажите, пожалуйста, как можно реализовать подобное.

Есть почтовик, к нему файлик с именами «активных» учётных записей в формате(.csv): name | name@domen.ru | password. И, собственно, папки этих пользователей, заголовок которых представляет из себя - name. Файлик давно никто не чистил и там скопились учетных записи «мертвых» пользователей. Идея заключается в том, чтобы проверить по дате есть ли в папке «Отправленные» письма за последние N дней. Если есть, то всё отлично - пользователь жив-здоров, а если нет - выводим его name на экран. До этого на баше не писал и то, что смог получить сделано путем гугления, чтения всего попавшегося под руку. Но, мне стало интересно разобраться до конца.

Мои «достижения»:

while read -a line
do
  find /tmp/spool/mail/vmail/domen.ru/${line[0]}/.Sent/cur -type f -mtime -10 -print
done < user_4_postfix.csv

В данном случае скрипт просто печатает файлики за последние 10 дней на экран, а если их нет, то сообщает об этом.



Последнее исправление: cetjs2 (всего исправлений: 2)

Найти все файлы за n дней, и просто все, вывести разность через comm. Наверное ещё можно смотреть mtime на каталоге, но это не точно.

anonymous
()
Ответ на: Ты уже всё сделал от legolegs

Либо подтупливаю, либо не совсем

Как я понимаю в итоге будет:

while read -a line
do
  if find /var/spool/mail/vmail/siz37.ru/${line[0]}/.Sent/cur -type f -mtime -10
    then echo ${line[0]} "User alive" #файлы за последние 10 дней есть
    else echo ${line[0]} "User is dead" #файлов за последние 10 дней нет
  fi
done < /usr/local/script/user_4_postfix.csv[/bash]

Но, при запуске скрипта он выводит на экран и сами файлы.
hanharr
() автор топика
Ответ на: Либо подтупливаю, либо не совсем от hanharr

Тут есть 2 нюанса:

1) find возвращает 0 даже если ничего не нашла (в отличие от grep)

2) вывод find надо спрятать

while read -a line
do
  if find /var/spool/mail/vmail/siz37.ru/${line[0]}/.Sent/cur -type f -mtime -10 | grep '$' >/dev/null
    then echo ${line[0]} "User alive" #файлы за последние 10 дней есть
    else echo ${line[0]} "User is dead" #файлов за последние 10 дней нет
  fi
done < /usr/local/script/user_4_postfix.csv
legolegs ★★★★★
()
Ответ на: комментарий от no-such-file

Почта вычищается старше N дней. Каждое действие внутри директории изменяет «Время правки», т.е. вариант отталкиваться от времени директории не подходит.

hanharr
() автор топика
Ответ на: комментарий от legolegs

Спасибо. Сам нашел вариант

-printf "found\n" >/dev/null
но с ним почему-то дольше выполняется скрипт. Подскажите, а как можно прервать выполнение find? Как я понимаю он сначала проходит по всем файлам соответствующим условию, при их налии, а лишь потом переходит к следующей директории. Можно сделать чтобы как только он нашел хотя бы один файл, то сразу переходил дальше. Это существенно сократило бы время выполнения скрипта. Если добавить
-quit
, то всем пользователям ставит «dead».

hanharr
() автор топика
Ответ на: комментарий от hanharr

Каждое действие внутри директории изменяет «Время правки», т.е. вариант отталкиваться от времени директории не подходит.

Вот сейчас специально попробовал «очистить» пустую директорию, и время модификации не изменилось. Система Debian Jessie, ф/с ext4.

aureliano15 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.