Eu precisava de uma solução elegante para o busybox (roteador), todas as soluções xargs ou array eram inúteis para mim - esse comando não está disponível lá. find e mtime não é a resposta correta, pois estamos falando de 10 itens e não necessariamente de 10 dias. A resposta de Espo foi a mais curta, limpa e provavelmente a mais não universal.
Erros com espaços e quando nenhum arquivo deve ser excluído são simplesmente resolvidos da maneira padrão:
rm "$(ls -td *.tar | awk 'NR>7')" 2>&-
Versão um pouco mais educacional: podemos fazer tudo se usarmos o awk de maneira diferente. Normalmente, eu uso esse método para passar (retornar) variáveis do awk para o sh. Enquanto lemos o tempo todo que não pode ser feito, imploro para diferir: aqui está o método.
Exemplo para arquivos .tar sem problemas em relação aos espaços no nome do arquivo. Para testar, substitua "rm" pelo "ls".
eval $(ls -td *.tar | awk 'NR>7 { print "rm \"" $0 "\""}')
Explicação:
ls -td *.tar
lista todos os arquivos .tar classificados por hora. Para aplicar a todos os arquivos na pasta atual, remova a parte "d * .tar"
awk 'NR>7...
pula as primeiras 7 linhas
print "rm \"" $0 "\""
constrói uma linha: rm "nome do arquivo"
eval
executa
Como estamos usando rm
, eu não usaria o comando acima em um script! O uso mais sábio é:
(cd /FolderToDeleteWithin && eval $(ls -td *.tar | awk 'NR>7 { print "rm \"" $0 "\""}'))
No caso de usar o ls -t
comando, não haverá nenhum dano em exemplos tolos como: touch 'foo " bar'
etouch 'hello * world'
. Não que nós sempre criamos arquivos com esses nomes na vida real!
Nota. Se quiséssemos passar uma variável para o sh dessa maneira, simplesmente modificaríamos a impressão (forma simples, sem espaços tolerados):
print "VarName="$1
para definir a variável VarName
para o valor de $1
. Várias variáveis podem ser criadas de uma só vez. Isso VarName
se torna uma variável sh normal e pode ser normalmente usada em um script ou shell posteriormente. Portanto, para criar variáveis com o awk e devolvê-las ao shell:
eval $(ls -td *.tar | awk 'NR>7 { print "VarName=\""$1"\"" }'); echo "$VarName"