Supondo que todos os nomes de arquivos no diretório atual sigam esse padrão, com GNU ls:
ls -rv | awk -F_ '++n[$1]>2' | xargs rm
Você pode omitir o | xargs rm se quiser verificar o que removeria primeiro .
Isso pressupõe que a parte em {...} não contenha espaço, nova linha, aspas simples, aspas duplas, barra invertida, tabulações ou caracteres de sublinhado.
A chave é a opção -v para a implementação GNU de ls que ordena por número de versão. Se você não tem o GNU ls , mas tem zsh , em zsh você pode usar:
print -rl -- *(nOn)
Para alcançar o mesmo resultado.
Agora, se o diretório atual puder conter qualquer coisa e você quiser processar apenas os arquivos que estão no formato {x}_y.z.xsl , em que x pode ser qualquer coisa e y e z são números inteiros decimais positivos, teria que escrevê-lo ( zsh syntax):
printf '%seval "files=($(ls -rv --quoting-style=shell-always))"
printf '%sls -rv | awk -F_ '++n[$1]>2' | xargs rm
' "${files[@]}" | perl -0 -lne '
unlink if /^\{(.*)\}_\d+\.\d+\.xsl\z/s && ++$n{$1} > 2'
' \{*\}_<->.<->.xsl(.nOn) | perl -0 -lne '
unlink if /\{.*\}/s && ++$n{$&} > 2'
Ou usando GNU ls e GNU bash em vez de zsh :
print -rl -- *(nOn)