Em zsh, se suas versões estiverem em ordem lexicográfica:
rm -f appname_*.tar.gz(N[1,-$((n+1))])
O qualificador da glob [NUM1,NUM2]
retém apenas as correspondências de NUM1 a NUM2. Com um sinal de menos, o número conta a partir do final (-1 é a última correspondência), portanto [1,-$((n+1))]
corresponde a todos, exceto os últimos $n
arquivos. O qualificador glob N
diz que está tudo bem se não houver correspondência (o que acontece se não houver mais de $n
arquivos).
Se as versões não estiverem em ordem lexicográfica, talvez seja necessário classificar os arquivos em uma ordem diferente. O qualificador de glob n
classifica os números decimais por valor, portanto, isso funcionará corretamente se você tiver appname_9_somedate
seguido por appname_10_someotherdate
.
rm -f appname_*.tar.gz(nN[1,-$((n+1))])
Se você tiver números de versão mais complexos, poderá especificar sua própria função de classificação. Escreva uma função zsh version_less
que retorne 0 se seu primeiro argumento for menor que seu segundo argumento e use
rm -f appname_*.tar.gz(N[1,-$((n+1))]o+version_less)
Em qualquer shell, se a ordem dos arquivos for ordem lexicográfica, você pode percorrer as correspondências.
set appname_*.tar.gz
while [ $# -gt $n ]; do
rm "$1"
shift
done
Se você precisar de um pedido diferente, analisar a saída de ls
é sua melhor aposta. Observe que ls
manipula caracteres não imprimíveis em nomes de arquivos, mas, no seu caso, isso não deve ser um problema.