Para uma solução portátil e confiável, tente o seguinte:
ls -1tr | head -n -10 | xargs -d '\n' rm -f --
A sintaxe tail -n -10
em uma das outras respostas parece não funcionar em todos os lugares (ou seja, não em meus sistemas RHEL5).
E usar $()
ou ''
na linha de comando de rm
corre o risco de
- dividindo nomes de arquivos com espaço em branco e
- excedendo o limite máximo de caracteres da linha de comando.
xargs
corrige esses dois problemas, pois descobrirá automaticamente quantos argumentos ele pode passar dentro do limite de caracteres e, com o -d '\n'
, somente será dividido no limite da linha da entrada. Tecnicamente, isso ainda pode causar problemas para nomes de arquivos com uma nova linha, mas isso é muito menos comum que nomes de arquivos com espaços, e a única maneira de contornar as novas linhas seria muito mais complicada, provavelmente envolvendo pelo menos awk, se não perl.
Se você não tem xargs (antigos sistemas AIX, talvez?), você pode fazer um loop:
ls -1tr | head -n -10 | while IFS= read -r f; do
rm -f "$f"
done
Isso será um pouco mais lento porque gera rm
separado para cada arquivo, mas ainda evitará as advertências 1 e 2 acima (mas ainda sofrerá de novas linhas nos nomes dos arquivos).