Как и обещал накидал небольшой скрипт...
#!/bin/bash
##################################
path=/tmp/testdir/2012
age=20
lcount=5
##################################
old="/tmp/oldest"
new="/tmp/newest"
find $path -type f -mtime +$age -printf '%T@ %p\n' | sort -n > $old
find $path -type f -mtime -$age > $new
count=$(wc -l $new | cut -d ' ' -f 1)
countold=$(wc -l $old | cut -d ' ' -f 1)
if [[ $countold -ne 0 ]]; then
if [[ $count -gt $lcount ]]; then
while read line; do
rm -rf $line
done <<< $(cat $old | cut -d ' ' -f 2)
else
let need=$lcount-$count
if [[ $countold -lt $need ]]; then
need=$countold
fi
if [[ $need -le 0 ]]; then
echo qq
exit 1
fi
tail -n $need $old >> $new
sed -i 1,${need}d $old
while read line; do
rm -rf $line
done <<< $(cat $old | cut -d ' ' -f 2)
fi
fi
rm -f $new $old
Суть такова, что все что по дате подходит он оставит, хоть там будет 200 бэкапов. Если того что по дате подходит меньше $lcount (я для примера 5 написал), то он возьмёт не хватающие из тех что старше указанной даты (должен взять наиболее близкие по дате к нужной, если я тут ошибся то поменять не сложно — там tail либо head, список уже отсортирован).
Отделенные параметры можно принимать в виде аргументов, я не стал заморачиваться.