Exclui arquivos, exceto n arquivos com o nome “maior”?

3

Eu quero criar um script de shell que exclua arquivos de versão antigos, exceto os últimos n arquivos. Em outras palavras, mantenha apenas as últimas n versões quando implantar uma nova versão.

Os nomes dos arquivos têm este formato:

appname_releasenumber_date.tar.gz

Talvez haja uma solução fácil para fazer isso, mas não consigo descobrir como fazer isso.

Eu encontrei esta solução Modo mais limpo para apagar arquivos em Linux que incluem um datestamp como parte de nome de arquivo mas eu preciso gerar alguns arquivos primeiro para manter o número de arquivos que eu quero .

    
por Feida Kila 19.06.2013 / 16:50

3 respostas

1

Você pode pesquisar os arquivos mais antigos e, em seguida, verificar se o número total de arquivos é maior do que N arquivos e depois excluir os arquivos mais antigos primeiro em um script ou também simplesmente usar o exemplo a seguir. Digamos que você não queira excluir os últimos 3 últimos arquivos:

ls -t1 | tail -n +4 | xargs rm -rf

    
por 19.06.2013 / 17:05
5

Vou alterar a resposta de @Salton para torná-lo mais geral:

ls -1 | sort -t_ -n -k2 | head -$(('ls | wc -l'-1)) | xargs rm -rf

Este classifica o número da versão e ignora completamente a data. Portanto, se uma versão mais antiga tiver uma data mais recente, a versão mais antiga será removida.

    
por 19.06.2013 / 18:02
2

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.

    
por 20.06.2013 / 16:48