Сценарий в листинге 6.12 выполняет обход всех файлов в каталоге
Код
Листинг 6.12. Сценарий rotatelogs
#!/bin/bash
# rotatelogs — выполняет ротацию файлов журналов в /var/log с целью
#·· архивирования и чтобы предотвратить чрезмерное увеличение файлов
#·· в размерах. Этот сценарий использует файл конфигурации, в котором
#·· можно настроить период ротации каждого файла. Записи в конфигурационном
#·· файле имеют формат logfilename=duration, где duration определяет
#·· количество дней. Если запись в конфигурационном файле для журнала
#·· logfilename отсутствует, rotatelogs будет выполнять ротацию такого
#·· журнала с частотой раз в семь дней. Если для журнала установлена
#·· продолжительность периода ротации, равная нулю, этот журнал будет
#·· игнорироваться сценарием.
logdir="/var/log"····# У вас журналы могут находиться в другом каталоге.
config="$logdir/rotatelogs.conf"
mv="/bin/mv"
default_duration=7·· # По умолчанию ротация выполняется через 7 дней.
count=0
duration=$default_duration
if [! -f $config]; then
··# Файл конфигурации отсутствует? Выйти. Эту проверку можно убрать
··#·· и в отсутствие конфигурационного файла просто использовать настройки
··#·· по умолчанию.
··echo "$0: no config file found. Can't proceed." >&2
··exit 1
fi
if [! -w $logdir −o! −x $logdir]; then
··# −w — право на запись, а −x — право на выполнение. Для создания
··#·· новых файлов в каталогах Unix или Linux необходимы оба. Если
··#·· права отсутствуют, завершить выполнение с выводом сообщения.
··echo "$0: you don't have the appropriate permissions in $logdir" >&2
··exit 1
fi
cd $logdir
# Как бы нам ни хотелось использовать в команде find стандартные обозначения,
#·· такие как: digit:, многие версии find не поддерживают POSIX-совместимые
#·· классы символов — поэтому [0–9].
# Замысловатая команда find подробно обсуждается далее в этом разделе.
#·· Не пропустите, если вам интересно!
for name in $(
····! -name '\.*'! -name '*conf' −print | sed 's/^\.\///')
do
··count=$(($count + 1))
··# Извлечь соответствующую запись из конфигурационного файла.
··duration="$(grep "^${name}=" $config|cut −d= −f2)"
··if [-z "$duration"]; then
····duration=$default_duration # Если совпадений нет, использовать период··································по умолчанию.
··elif ["$duration" = "0"]; then
····echo "Duration set to zero: skipping $name"
····continue
··fi
··# Подготовить имена файлов для ротации. Это просто: