Назад | Перейти на главную страницу

Bash: удалить старые файлы, кроме одного

Я использую следующую команду для удаления старых файлов резервных копий:

find backups/ -name "bak_*.tbz" -mmin +4800 -exec rm -vf {} \;

Проблема: когда новых файлов нет, все файлы удаляются. В таком случае я бы предпочел оставить себе самую новую.

Как можно элегантно удалить старые файлы, кроме самого нового?

 find  backups/ -name "bak_*.tbz" -mmin +4800 -type f -printf '%T@ %p\n' | sort -k 1nr |\
      tail -n +2 | cut -d ' ' -f 2 | xargs echo rm {}

Это предполагает, что GNU find и напечатает время модификации и имя файла, отсортирует его по времени модификации, удалит первую строку (самый новый файл), удалит столбец времени модификации и передаст это xargs для удаления (как уже говорилось, он будет только отображать команду удаления, но не выполняет ее).