Что-то вроде
ls datedir | head -n -1 | xargs rm
(не проверено, поэтому не подвергайте это ценным данным без тестирования)
У нас есть скрипт, который ежечасно создает резервные копии и сохраняет его в папке, созданной на сегодняшний день.
#CRONJOB TO BACKUP DB HOURLY DAY=$(/bin/date +%d%m%Y) TIME=$(/bin/date +%H%M%S) if [ ! -d /home/user/Desktop/cron_database_hourly/$DAY ]; then sudo mkdir /home/user/Desktop/cron_database_hourly/$DAY fi sudo chmod -R 755 //home/user/Desktop/cron_database_hourly/$DAY cd /home/user/Desktop/cron_database_hourly/$DAY/ mysqldump -u root -p'password' current > current_$TIME.sql zip current_$TIME.zip current_$TIME.sql > /dev/null 2>&1 sudo rm current_$TIME.sql
Итак, в папке 20072018 будет 24 файла, а имена будут выглядеть как current_000001.zip
Сейчас у нас мало места, поэтому решили хранить только одну резервную копию в день и удалять все остальное.
Я попробовал следующий скрипт, который удаляет все, кроме 23-го часа резервного копирования.
sudo find /home/user/Desktop/cron_database_hourly/* -type f \( -name "*_00*.zip" -o -name "*_01*.zip" -o -name "*_02*.zip" -o -name "*_03*.zip" -o -name "*_04*.zip" -o -name "*_05*.zip" -o -name "*_06*.zip" -o -name "*_07*.zip" -o -name "*_08*.zip" -o -name "*_09*.zip" -o -name "*_10*.zip" -o -name "*_11*.zip" -o -name "*_12*.zip" -o -name "*_13*.zip" -o -name "*_14*.zip" -o -name "*_15*.zip" -o -name "*_16*.zip" -o -name "*_17*.zip" -o -name "*_18*.zip" -o -name "*_19*.zip" -o -name "*_20*.zip" -o -name "*_21*.zip" -o -name "*_22*.zip" \) -mtime +30 -delete
Но проблема в том, что в некоторые дни 23-я резервная копия недоступна, потому что сервер был выключен. Как я могу изменить приведенный выше скрипт так, чтобы он проверял ФАЙЛ ПОСЛЕДНЕГО РЕЗЕРВНОГО КОПИРОВАНИЯ каждой даты, сохранял только этот файл и удалял все остальное?
Что-то вроде
ls datedir | head -n -1 | xargs rm
(не проверено, поэтому не подвергайте это ценным данным без тестирования)
Ты можешь использовать:
ls /home/user/Desktop/cron_database_hourly/$DAY/*_[012][0-9]*.zip | head -n -1 | \ while read -r f; do rm "$f"; done
Он находит все архивные файлы в каталоге, отсортированные лексикографически, затем использует head
для перечисления все, кроме last ( -n -1
), и удаляет перечисленные файлы в while
цикле.
Я предлагаю вам поставить echo
раньше rm
, чтобы увидеть, какие команды будут выполняться перед использованием вживую.