Bash скрипт для очистки старых файлов резервных копий

Я использую систему резервного копирования 12+31, то есть я сохраняю один файл из каждого месяца за прошедший год, плюс один файл за каждый день текущего месяца. Мне трудно понять, как создать сценарий bash, который будет выполнять следующую очистку:

  • поиск в каталоге и его подкаталогах на удаленном SFTP-сервере
  • в каждом каталоге ищите файлы: НЕ с этого месяца и НЕ С ПЕРВОГО предыдущего месяца
  • с выбранными файлами, удалите их с удаленного SFTP-сервера

Например, если сейчас ноябрь, этот скрипт будет:

  • искать все каталоги ниже указанной цели на моем удаленном SFTP-сервере
  • игнорировать все файлы, которые были созданы в ноябре
  • удалить все файлы с октября за исключением файлов с 1 октября
  • удалить все файлы с сентября, КРОМЕ для файлов с 1 сентября
  • так далее...

Он будет работать на сервере общего хостинга (Dreamhost), поэтому у меня не будет возможности устанавливать какие-либо пользовательские инструменты CLI.

Все мои файлы резервных копий содержат дату в имени файла, но я бы предпочел сверяться с датой создания файла, если это возможно.

Я видел много материала об удалении файлов старше [x], но я не совсем понимаю, как пропустить файлы, начиная с первого месяца.

1 ответ

Решение

Вот лучшее, что я могу придумать на данный момент:

find . -type f \         # files only
    -mtime +31 \         # exclude files less than 31 days old
    -printf '%Td %p\n' | # prepend filename with day of the month of last modification
  grep -v '^01' |
  sed 's/^[0-9][0-9] //'

Некоторые предостережения:

  • зависит от GNU найти
  • исключает файлы за последние 31 день, а не строго исключая текущий месяц
  • смотрит на время последней модификации, а не на время создания. Большинство файловых систем не отслеживают время создания; если у вас есть, вам понадобится какой-то инструмент, кроме GNU find, чтобы получить к нему доступ
  • вы не можете иметь переводы строк в ваших именах файлов
Другие вопросы по тегам