Удалить старую резервную копию из каталога с помощью команды командной строки

#linux #shell #unix #awk #crontab

#linux #оболочка #unix #awk #cron

Вопрос:

В моем сценарии оболочки я создаю резервную копию своей папки. Я устанавливаю это действие с помощью cronjob, и расписание продолжает меняться.

Он сохраняет резервную копию с меткой времени. Например, для :

cd /tmp/BACKUP_DIR

 backup_06-05-2014.tar
backup_06-08-2014.tar
backup_06-10-2014.tar
  

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

Например, если я сейчас запущу скрипт, он должен сохранить

 backup_06-10-2014.tar
backup_06-18-2014.tar
  

И удалите все остальные. Какую rm команду я должен использовать?

Комментарии:

1. Я бы рекомендовал использовать формат даты ГГГГММДД в имени файла, сортировать по возрастанию / убыванию, выбирать и удалять первый / последний в списке.

Ответ №1:

Попробуйте выполнить следующее:

 rm $(ls -1t /tmp/BACKUP_DIR | tail -n  2)
  

Список отсортированных по дате имен файлов с оставшимися только двумя самыми новыми

Комментарии:

1. Потрясающее и элегантное решение!!

2. На моем mac мне нужно добавить одну, чтобы получить нужное количество строк, поэтому для двух новейших мне придется использовать rm $(ls -1t /tmp/BACKUP_DIR | tail -n 3)

Ответ №2:

Вы можете попробовать удалить файлы старше 7 дней, например, с помощью команды find :

 find /tmp/BACKUP_DIR -maxdepth 1 -type f -name "backup_*.tar" -mtime  6 -exec rm -f {} ;
  

Ответ №3:

Используйте

 rm -rf `ls -lth backup_*.tar | awk '{print $NF}' | tail -n  4`
  
  1. ls -lth backup_*.tar предоставит отсортированный список файлов резервных копий (самые новые находятся вверху)
  2. awk ‘{print $NF}’ напечатает имена файлов и передаст их в tail
  3. tail -n 4 , будет печатать файл с номером 3
  4. Наконец, результат tail передается в rm для действия

Еще один упрощенный метод

 rm -rf `ls -1rt backup_*.tar | tail -n  3`