Desejo excluir todo o log de archive, exceto reter o último log de archive gerado

1

Eu quero excluir todo o archivelog, mas manter o último log de arquivo gerado sozinho.

Atualmente estou usando o seguinte, que excluirá todo / todo o log do arquivo e limpará o próprio diretório.

find . -name "dbf*" -mtime +0 -exec rm -rf {} \;

Mas quero manter o último log de arquivo gerado. Como fazer? Qual é o comando que preciso usar para o mesmo?

    
por sivakumar KS 24.02.2015 / 08:28

2 respostas

0

Se você não puder saber que apenas um arquivo por dia é gerado (seu comando com falha funcionaria nesse caso), será necessário enviar a saída de find na qual você tem uma combinação do carimbo de data e hora de o arquivo e o nome de arquivo em sort e, em seguida, excluir a linha final com sed antes de dividir o carimbo de data / hora (novamente com sed ) e alimentar os nomes resultantes em xargs -0 rm :

find . -type f -name "dbf*" -printf "%T@:%p
find . -type f -name "dbf*" -printf "%T@:%p%pre%" | sort -z | sed -z '$d' | \
       sed -z 's/[0-9\.]*://' | xargs -0 rm
" | sort -z | sed -z '$d' | \ sed -z 's/[0-9\.]*://' | xargs -0 rm

Como os nomes dos arquivos começarão com ./ , o segundo sed corresponderá apenas ao primeiro ':', mesmo que a correspondência seja gulosa ( -printf "%T@:%p" fornece algo como 1424765805.0206990940:./dbf_xyz )

Isso deve funcionar com nomes de arquivos com espaços e novas linhas também, porque toda a cadeia está usando "linhas" terminadas em NUL

    
por 24.02.2015 / 09:12
0

Isso funciona se você não se importar em copiar o arquivo mais recente para outro diretório enquanto o restante é removido. Assumindo que você é o diretório de trabalho atual é aquele com os logs:

cp $(ls -Art | tail -n 1) /tmp \
&& rm -ri /path/to/logs \
&& cp /tmp/$(ls -Art /tmp | tail -n 1) ./ \
&& rm -i /tmp/$(ls -Art /tmp | tail -n 1)

Detalhado:

  • cp $(ls -Art | tail -n 1) /tmp copia a saída de ls -Art | tail -n 1 , que deve ser o arquivo modificado mais recentemente para o diretório /tmp . Você provavelmente deve criar um novo diretório para isso, em vez de /tmp , ou usar algo que você sabe que não terá nenhum outro arquivo modificado.

  • rm -ri /path/to/logs deve remover todos os descritores de arquivos nesse diretório.

  • cp /tmp/$(ls -Art /tmp | tail -n 1) ./ copia o arquivo modificado mais recentemente em /tmp de volta para o seu diretório de trabalho.

  • rm -i /tmp/$(ls -Art /tmp | tail -n 1) remove o arquivo copiado para /tmp .

por 24.02.2015 / 09:54

Tags