Удалить все файлы старше определенного имени файла?

2

Я хочу иметь возможность искать самый последний файл, заканчивающийся на .backup, и удалять ВСЕ файлы, которые старше этого файла (но, конечно, сохраняют более новые файлы).

Вот пример списка каталогов, где вы можете увидеть несколько сделанных резервных копий. Я хотел бы сохранить файлы 000000020000000000000083.00000020.backup и 000000010000000000000082, но как-то удалить все старое.

Я могу придумать много хакерских способов сделать это, например, выполнить поиск с -mtime и удалить файл старше одного дня, что может сработать для меня, но не правильно . Я мог бы также составить список каталогов ДО того, как я сделаю резервную копию, затем сравнить ее с последующими и удалить все файлы, которые были до этого. Это все еще не правильно.

Есть идеи?

$ ls -ltr
total 131084
-rw-r-----. 1 cm800 cm800        0 May  6 13:58 archive_06_05_14___13_58_05
-rw-------. 1 cm800 cm800 16777216 May  6 13:58 00000001000000000000007F
-rw-------. 1 cm800 cm800 16777216 May  6 13:58 000000020000000000000080
-rw-------. 1 cm800 cm800 16777216 May  6 13:58 000000020000000000000081
-rw-------. 1 cm800 cm800      242 May  6 13:58 00000001000000000000007F.00000020.backup
-rw-------. 1 cm800 cm800      242 May  6 13:58 000000020000000000000081.00000020.backup
-rw-------. 1 cm800 cm800 16777216 May  6 14:03 000000010000000000000080
-rw-------. 1 cm800 cm800 16777216 May  6 14:06 000000020000000000000082
-rw-------. 1 cm800 cm800 16777216 May  6 14:06 000000010000000000000081
-rw-------. 1 cm800 cm800 16777216 May  6 14:07 000000020000000000000083
-rw-------. 1 cm800 cm800      242 May  6 14:07 000000020000000000000083.00000020.backup
-rw-------. 1 cm800 cm800 16777216 May  6 14:11 000000010000000000000082
AaronG
источник

Ответы:

3

Используйте -nt, -otоператор , чтобы проверить , является ли старше / новее , чем другим файлом:

#! /bin/bash

# Find the newest backup file:
unset newest
for f in *.backup ; do
    [[ $newest ]] || newest=$f           # Initialize.
    [[ $f -nt $newest ]] && newest=$f    # Keep the newest so far.
done

# Delete all the older files:
for f in * ; do
    [[ $f -ot $newest ]] && rm "$f"
done
choroba
источник
Возможно, вы также захотите рассмотреть более эффективные алгоритмы сортировки ... bashguru.com/2011/01/quicksort-shell-script.html
Эрик Г
@EricG: я не сортирую. Я ищу минимум. Все это O (n).
Чороба
Это работает хорошо, если вы по какой-то причине не изменили один из ваших архивов wal (mv / cp / touch и т. Д.) И время изменения не изменилось. Вы можете положиться на имя файла для поиска / удаления -[[ "$f" < "$newest" ]]
csny