Страницы

Поиск по вопросам

среда, 12 декабря 2018 г.

архивация логов

есть каталог /var/log
как с помощью с скрипта заархивировать логи старше, чем вчера, в папку /var/log/archive?
логи имеют формат yyyy_mm_dd_name.log


Ответ

главные трудности, видимо, следующие:
отобрать только те файлы в текущем каталоге, имена которых соответствуют шаблону yyyy_mm_dd_name.log, где name — произвольный набор символов, не содержащий символа _ исключить из отобранных те файлы, в именах которых часть yyyy_mm_dd соответствует сегодняшней или вчерашней дате что-то сделать с найденными файлами (например, переместить куда-нибудь)

решение:
отобрать в текущем каталоге такие файлы можно, например, так:
$ find -maxdepth 1 -regextype posix-basic -regex "\./[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[^_]\+\.log"
проверим, создав тестовые файлы (один содержит сегодняшнюю дату, один — вчерашнюю, один — позавчерашнюю, и один, контрольный, не содержит даты в имени):
$ touch 2016_07_04_some.log 2016_07_03_some.log 2016_07_02_some.log some.file $ find -maxdepth 1 -regextype posix-basic -regex "\./[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[^_]\+\.log" ./2016_07_03_some.log ./2016_07_04_some.log ./2016_07_02_some.log
вроде, правильно. чтобы исключить файлы, в имени которых содержится сегодняшняя или вчерашняя дата, надо добавить к опциям программы find такую примерно конструкцию:
\! -regex "\./2016_07_04_[^_]\+\.log" \! -regex "\./2016_07_03_[^_]\+\.log"
тогда в вывод попадает только позавчерашний файл:
./2016_07_02_some.log
но завтра ведь даты будут другие. как привязаться к текущему дню?
с помощью программы date, например. сегодняшняя дата:
$ date +'%Y_%m_%d' 2016_07_04
и вчерашняя:
$ date -d 'day ago' +'%Y_%m_%d' 2016_07_03
заключаем вызовы date в «операторные скобки» $(...), подставляем в нужные места, и получаем длинную команду:
$ find -maxdepth 1 -regextype posix-basic -regex "\./[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[^_]\+\.log" \! -regex "\./$(date +'%Y_%m_%d')_[^_]\+\.log" \! -regex "\./$(date -d 'day ago' +'%Y_%m_%d')_[^_]\+\.log" ./2016_07_02_some.log для того, чтобы переместить найденные программой find файлы в каталог, например, /var/log/archive, можно добавить к опциям той же программы такую, например, конструкцию:
-exec mv {} /var/log/archive \;

итого полный текст команды будет таким:
$ find -maxdepth 1 -regextype posix-basic \ -regex "\./[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[^_]\+\.log" \ \! -regex "\./$(date +'%Y_%m_%d')_[^_]\+\.log" \ \! -regex "\./$(date -d 'day ago' +'%Y_%m_%d')_[^_]\+\.log" \ -exec mv {} /var/log/archive \;
он разбит на строки исключительно для удобства обзора. если вставлять этот текст в одну строку, то последний в каждой строке символ \ надо удалить.

Комментариев нет:

Отправить комментарий