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


14

Мне нужно удалить из папки все файлы старше определенного файла.
Запуск bash на CentOS 7.

У меня есть решение для этого, но я думаю, что должен быть более элегантный способ сделать это:

reference_file=/my/reference/file

get_modify_time()
{
    stat $1 | grep -Po "Modify: \K[0-9- :]*"
}

pit=$(get_modify_time $reference_file)
for f in /folder/0000* ; do [[ "$pit" > "$(get_modify_time $f)" ]] && rm $f ; done

Ответы:


28

Я не пробовал, но findдолжен быть в состоянии справиться со всей операцией просто отлично:

$ find dir/ -type f ! -newer reference -delete

... или...

$ find dir/ -type f ! -newer reference ! -name reference -delete

В принципе:

  • ! -newer referenceсоответствует файлы , которые были изменены в меньшей степени , чем в последнее время reference.
  • -delete удаляет их.
  • ! -name referenceисключает reference, если он также находится под, dir/и вы хотите сохранить его.

Это должно удалить все файлы старше referenceи, расположенные в dir/.


2
Отлично :). Просто добавил, -maxdepth 1чтобы поиск не был рекурсивным
csny

3
! -newerозначает «не новее», значит «старше или ровесницы »; сам файл будет сопоставлен, если он находится в пути find, о котором нужно помнить.
Ферада

1
@ferada Не будет, если вы исключите его, поэтому мой ответ также включает в себя ! -name reference(см. третий пункт).
Джон У. С. Смит,

7

сравните время модификации файла с testпомощью операторов -nt(новее чем) и -ot(старше чем):

if [ "$file1" -ot "$file2" ]; then
    #do whatever you want;
fi

2
Спасибо, это лучше, чем мое решение, но вам все еще нужно перебрать все файлы в папке и сравнить ... Другой ответ еще более элегантный
csny
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.