Eu inventei:
find . -type f -size '+2M' -print | while read i
do
echo " " > $i
done
que funciona.
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
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
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
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 ...