Вопрос или проблема
Я пытаюсь удалить ненужные данные из директорий rsyslog (в основном много пустых подкаталогов или подкаталогов с одним частичным файлом журнала), но с самыми разными именами, начиная от слов, которые выглядят обрезанными, до 10 дефисов. Я думал, что самый простой способ сделать это – просто искать всё нужное и объявить всё остальное мусором, но здесь возникают трудности.
Мне нужно сохранить
- 5-10 файлов/подкаталогов по умолчанию, которые создаются при создании нового слушателя rsyslog
- любую директорию, которая является именем хоста (любой подкаталог, начинающийся с “vd” или “vp”)
- любую директорию, представляющую IP-адрес.
Всё остальное можно удалить.
Я думал просто использовать grep и исключить всё, что соответствует этим поисковым терминам, а затем сделать список директории в текстовый файл, который я мог бы использовать в качестве входного списка для удаления, но у меня возникают проблемы с именами хостов, как только я ввожу “vp*”, я ничего не получаю. Кроме того, строка, которую я использую для поиска IP-адресов, также захватывает даты.
Мой текущий поиск выглядит следующим образом:
egrep -av 'HEAD|GET|version|putenv|id|default|POST|status|rsyslog_stats' |
grep -E "[^^][0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}" |
grep -av "vp*" |
grep -av "vd*"
Если у кого-то есть предложения, я был бы очень признателен, так как если бы я смог это заставить работать, я мог бы запускать это каждые 15-30 минут и поддерживать чистоту всех моих директорий слушателей rsyslog и не загружать так много мусора в свои индексы Splunk.
Спасибо!
#!/usr/bin/env bash
declare -r RSYSLOG_ROOT_PATH='/path/to/whatever'
cd "$RSYSLOG_ROOT_PATH" || exit 1
for dirname in *; do
test -L "$dirname" && continue
test -d "$dirname" || continue
[[ $dirname =~ ^v[dp] ]] && continue
[[ $dirname =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]] && continue
[[ $dirname =~ ^(HEAD|GET|version|putenv|id|default|POST|status|rsyslog_stats)$ ]] && continue
echo rm -r "$dirname"
done
Ответ или решение
Конечно. Давайте рассмотрим, как можно эффективно использовать команды grep
и find
для очистки ненужных данных из директорий rsyslog
, сохраняя при этом важные файлы и поддиректории.
Теория
Когда речь идет о системной администрировании и управлении файлами, часто возникает необходимость автоматизировать процесс очистки директорий. Ваша задача состоит в том, чтобы удалить мусорные данные из директорий rsyslog
, оставив только необходимые файлы и поддиректории. Вы хотите сохранить:
- Стандартные файлы/поддиректории, создаваемые по умолчанию.
- Поддиректории, которые являются именами хостов и начинаются с "vd" или "vp".
- Поддиректории, имена которых представляют собой IP-адреса.
Команды find
и grep
могут быть очень полезными в этом случае. find
позволяет рекурсивно исследовать файловую систему и выбирать файлы или директории по заданным критериям, в то время как grep
предоставляет мощные инструменты для фильтрации текстовых данных, таких как имена файлов или содержимое.
Пример
Рассмотрим пример использования команд find
и grep
в Bash-скрипте для выполнения вашей задачи. Ниже приведен скрипт, который позволит вам удалять ненужные директории, сохраняя те, что соответствуют вашим критериям.
#!/usr/bin/env bash
declare -r RSYSLOG_ROOT_PATH='/path/to/whatever'
cd "$RSYSLOG_ROOT_PATH" || exit 1
for dir in */; do
# Пропускаем символические ссылки
[ -L "$dir" ] && continue
# Проверяем, является ли элемент директорией
[ -d "$dir" ] || continue
# Исключаем директории, начинающиеся с 'vd' или 'vp'
[[ $dir =~ ^v[dp] ]] && continue
# Исключаем директории, являющиеся IP-адресами
[[ $dir =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/$ ]] && continue
# Исключаем стандартные файлы/директории
[[ $dir =~ ^(HEAD|GET|version|putenv|id|default|POST|status|rsyslog_stats)/$ ]] && continue
# Если ни одно из условий не выполнено, удаляем директорию
echo "Удаление директории: $dir"
rm -r "$dir"
done
Вы можете заметить, что в данном примере целью является удаление директорий, не соответствующих заданным критериям. Скрипт также обрабатывает символические ссылки и проверяет, является ли элемент директорией, прежде чем выполнять удаление.
Применение
Будучи ИТ-специалистом, вы, вероятно, владеете навыками написания скриптов Bash. Этот скрипт можно настроить для запуска каждые 15-30 минут с помощью планировщика задач, например cron
. Это позволит вам автоматизировать процесс очистки без непосредственного вмешательства, что значительно упростит управление ресурсами.
Настройте cron
следующим образом:
*/15 * * * * /path/to/your-script.sh
Эта запись в crontab
выполнит ваш скрипт каждые 15 минут. Убедитесь, что у скрипта есть права на выполнение, и путь к нему указан правильно.
Заключение
Использование команд grep
и find
с соответствующими регулярными выражениями для фильтрации директорий позволяет автоматизировать процесс управления данными, экономя время и ресурсы. Убедитесь, что перед применением скриптов на реальных данных произведено тестирование на копии данных, чтобы избежать потери важных данных. Интеграция таких решений в вашу систему администрирования позволит поддерживать порядок и эффективно распределять ресурсы вашего сервера.