Aqui está um exemplo de logs na minha pasta / var / www / apache2 / log
./no_domain_access.log.7.gz
./no_domain_access.log.8.gz
./no_domain_access.log.9.gz
./no_domain_error.log.10.gz
./no_domain_error.log.11.gz
./no_domain_error.log.12.gz
./no_domain_error.log.13.gz
./no_domain_error.log.14.gz
./no_domain_error.log.15.gz
./no_domain_error.log.16.gz
./no_domain_error.log.17.gz
./no_domain_error.log.18.gz
./no_domain_error.log.19.gz
./no_domain_error.log.20.gz
e vai até 50 ...
Gostaria de iterar sobre esses arquivos e remover todos os arquivos de log maiores que 5.
usando a sintaxe regex me dará a opção decorresponder a números no padrão de [1-9] ou {1,2}, mas isso também corresponderá aos arquivos de log que eu não quero excluir (números únicos de 1 a 5 arquivos de log que desejo manter)
Como posso combinar apenas nomes de arquivos com números maiores que 5?
Obrigado!
Respostas:
2 para resposta № 1Você pode usar awk
uma linha para isso:
printf "%sn" *[0-9].gz | awk -F "." "$(NF-1) >= 5"
Este comando awk usa ponto como separador de campo e comparado $(NF-1)
(esse é o campo numérico antes do ramal) com número 5
.
Para excluir esses arquivos, use:
printf "%sn" *[0-9].gz | awk -F "." "$(NF-1) >= 5" | xargs rm
xargs
recebe entrada de awk
e rm
O comando apenas exclui esses arquivos.
1 para resposta № 2
Use o bash
operador regex ~
para extrair o número e Lista o arquivo se o número for maior que 5
for file in /var/www/apache2/log/*.gz; do
test -f "$file" || continue
[[ $file =~ ^.*log.([[:digit:]]+).*$ ]] && { (( "${BASH_REMATCH[1]}" > 5 )) && printf "%sn" "$file"; }
done
Se você quer apenas excluir os arquivos, substitua printf "%sn"
por apenas rm
.
0 para resposta № 3
Localizar com expressões regulares
find . -regex "./no_domain_access.log.*gz" ! -regex "./no_domain_access.log.[1-5].gz"
Encontre todos os arquivos que correspondam a no_domain ... e execute outra expressão regular para obter todos esses resultados menos os arquivos com 1 a 5.
0 para a resposta № 4
Sem expressões regulares, usando shell globs e código de shell POSIX totalmente nativo e portátil:
rm -f no_domain_access.log.[6-9].gz no_domain_access.log.[0-9][0-9].gz
É mais fácil no bash:
rm -f no_domain_access.log.{6..50}.gz
Estes são provavelmente criados com logrotate ou um similar rotação de log utilidade.
Você pode apenas alterar sua configuração para armazenar apenas cinco logs.
Se for controlado por logrotate, você poderá encontrar a documentação com man logrotate
e você provavelmente encontrará algo parecido com isto:
/var/log/no_domain_access.log {
rotate 50
daily
}
Mudar o 50
para 5
e você está pronto. Você provavelmente (?) ainda precisa limpar os logs antigos atuais usando um dos comandos acima.