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)