есть каталог /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 \;
он разбит на строки исключительно для удобства обзора. если вставлять этот текст в одну строку, то последний в каждой строке символ \ надо удалить.
Комментариев нет:
Отправить комментарий