Скрипт Ubuntu для сохранения только последнего файла из каждой папки и удаления всего остального

Скрипт Ubuntu для сохранения только последнего файла из каждой папки и удаления всего остального

У нас есть скрипт, который создает резервные копии каждый час и сохраняет их в папке, созданной под сегодняшней датой.

#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

Итак, внутри папки будет 24 файла.20072018и имена будут такимитекущий_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-й бэкап недоступен, потому что сервер был выключен. Как мне изменить скрипт выше, чтобы он проверялПОСЛЕДНИЙ ФАЙЛ РЕЗЕРВНОЙ КОПИИ на каждую дату и оставить только этот файл и удалить все остальное?

решение1

Вы можете использовать:

ls /home/user/Desktop/cron_database_hourly/$DAY/*_[012][0-9]*.zip | head -n -1 | \
       while read -r f; do rm "$f"; done

Эта функция находит все архивные файлы в каталоге, отсортированные в лексикографическом порядке, затем использует их headдля перечисления всех, кроме последнего ( -n -1), и удаляет перечисленные файлы в whileцикле.

Я предлагаю вам изначально поставить echobefore rm, чтобы увидеть, какие команды будут выполнены перед использованием live.

решение2

Что-то вроде

ls datedir | head -n -1 | xargs rm

(не проверено, поэтому не подвергайте этому ценные данные без проверки)

Связанный контент