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