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

213
Ash

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

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

0

2 ответа на вопрос

0
Henrik

Что-то вроде

ls datedir | head -n -1 | xargs rm 

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

0
AFH

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

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, чтобы увидеть, какие команды будут выполняться перед использованием вживую.

Спасибо Но проблема в каталоге cron_database_hourly, там будет много папок, названных в честь соответствующей даты. Например: 20072018, 21072018 и я хочу удалить файлы из всех этих каталогов, и мне нужно применить эти правила для файлов, которые только 30 дней. Ash 5 лет назад 0
Вы не можете использовать ту же технику в каталогах, так как временный порядок не совпадает с лексикографическим порядком. Если ваша файловая система не поддерживает даты рождения файлов, вы также не можете использовать `find -newerXY`. Если вы изменили формат каталога на `DAY = $ (/ bin / date +% Y% m% d)`, то временной порядок становится таким же, как лексикографический. В противном случае вам нужно будет использовать серию из трех сортировок в столбцах, содержащих год, месяц и день соответственно. Это слишком долго для комментария, но если вы зададите новый вопрос, я постараюсь ответить на него. AFH 5 лет назад 0
Я создал отдельный вопрос: https://superuser.com/questions/1342472/script-to-remove-all-but-retain-one-latest-backup-file-of-all-sub-directories Ash 5 лет назад 0
Ваш новый вопрос отменил требование, чтобы файлы были 30 дней, что делает проблему намного проще. Это больше не ограничение? это, безусловно, делает проблему намного проще. AFH 5 лет назад 0

Похожие вопросы