Limpando o conteúdo dos arquivos por tamanho

0

Considerando se listo arquivos em um diretório:

drwx--x--x 43 root wheel 4.0K Aug 18 12:52 ..
-rw-------  1 root root  268K Aug 18 04:31 build_locale_databases_log
-rw-------  1 root root  5.2M Aug 18 17:21 access_log
-rw-------  1 root root   85K Aug 18 17:14 cpbackup_transporter.log
-rw-------  1 root root  2.1M Aug 18 05:49 cphulkd.log
-rw-------  1 root root  3.2M Aug 18 17:19 error_log
-rw-------  1 root root  1.7M Aug 18 12:52 license_log

Aqui eu quero limpar o conteúdo dos arquivos que são maiores que 2Mb . (isto é, tornar o tamanho do arquivo em zero bytes para os seguintes arquivos:

access_log
cphulkd.log
error_log
    
por Leslin Jea 18.08.2015 / 09:34

4 respostas

-1

Eu inventei:

find . -type f -size '+2M' -print | while read i
do
echo " " > $i
done

que funciona.

    
por 18.08.2015 / 13:04
3

Gosto de responder primeiro à pergunta direta, mas não corra antes de ler até o final da minha resposta . O comando que você está pedindo (que pode não ser o que você quer) é:

find /wherever -type f -name '*.log' -size +4096 -print \
    | xargs truncate --size 0

Observe que o +4096 significa arquivos com mais de 4096 setores de 512 bytes. O problema é que, se esses são arquivos de log para os quais um processo está gravando ativamente, esses processos manterão sua posição no arquivo. Você recuperará o espaço em disco (supondo que seu sistema de arquivos suporta arquivos esparsos, o que a maioria faz), mas quando você for olhar seus logs, haverá blocos de zeros no começo. Então você realmente precisa reiniciar seu daemon após fazer isso, ou melhor ainda, mover os arquivos para fora do caminho e reiniciar seus daemons:

cd /wherever
find . -name '*.log' -maxdepth 1 -size +4096 -exec mv {} {}.old \;
systemctl restart yourservice (or whatever you need to restart)
rm -f *.old
    
por 18.08.2015 / 09:47
2

Você pode fazer isso por um comando de localização:

for i in $(find . -type f -size +2097152c);do  cat /dev/null > $i;done

O comando de localização find . -type f -size +2097152c encontrará todos os arquivos de tamanho maiores que

2MB (2097152 bytes)

O loop for entrará na lista dos arquivos que ele obteve no comando find e irá limpá-los com um cat /dev/null

------ Editar ------

Como sugerido por user3188445 Você também pode tentar fazer isso

for i in $(find . -type f -size +2097152c);do  :  > $i;done
    
por 18.08.2015 / 10:09
0

Posixly:

find . ! -name . -prune -type f -size +2097152c -exec sh -c '
  for f do
    : > "$f"
  done
' sh {} +

Com o GNU find ou o BSD, ache:

find . -maxdepth 1 -type f -size +2M ...
    
por 18.08.2015 / 09:45

Tags