Você pode reverter a ordem dos arquivos ( sort --reverse ) para que os arquivos mais recentes sempre sejam os primeiros em um bloco de arquivos com o mesmo prefixo. Então você pode acompanhar o bloco atual (com $current_prefix ) e manter o primeiro arquivo em cada bloco ( continue ) e rm todos os outros arquivos no bloco:
current_prefix=
find . -name '???_*.txt' | sort --reverse | while read line; do
if [[ ${line[1,5]} != $current_prefix ]]; then
# we are at the beginning of a new block
current_prefix=${line[1,5]}
continue # actually not needed b/c there is nothing outside the if block.
else
rm -- $line
fi
done
Observação: para testar isso primeiro, você pode inserir todos os comandos rm com echo .
Para listar apenas os arquivos que você deseja manter, você pode usar sort e uniq :
find . -name '???_*.txt' | sort --reverse | uniq --check-chars 3