Meu título é um pouco estranho eu sei. Eu não conseguia pensar em uma maneira de expressar melhor.
Eu tenho um diretório que contém vários diretórios, cada um cheio de arquivos de log. Todo arquivo de log é nomeado no formato AAAA-MM-DD.log. Por isso, seria /path/to/logs/tokyo/2017-06-29.log, /path/to/logs/london/2017-06-29.log, etc.
Um novo log é aberto todos os dias à meia noite com a nova data e os antigos nunca serão gravados novamente.
Existem literalmente milhares desses registros que remontam a anos e, embora sejam apenas arquivos de texto, eles estão começando a ocupar uma quantidade não desprezível de espaço. Então, o que eu estou tentando fazer é escrever um script que olhe em todos esses diretórios de log, encontre qualquer data antes de hoje e faça um bzip deles. Aqui está o que eu tenho até agora:
#!/bin/sh
LOGDATE=$(date +%Y-%m-%d)
LOGPATH="/path/to/logs"
for i in $(ls $LOGPATH/*/*.log); do
if [ "$i" != "$LOGDATE.log" ];then
tar cfjv $i.tar.bz2 $i
rm $i
else
fi
done
Existem dois problemas que estou enfrentando. Primeiro, o $ (ls ...) no loop for equivale a dizer que a lista de argumentos é muito longa. Segundo, na declaração tar, eu quero que o arquivo de saída do bzip esteja no diretório onde o arquivo de log estava, mas ele parece deixá-los no diretório do qual o script está sendo executado, e não consigo encontrar uma maneira de faça o loop usar o diretório correto para cada arquivo correspondente que encontrar.
Presumivelmente, isso seria mais bem tratado com um comando find e xargs bem escrito, mas não consegui fazer um que faça o que eu preciso fazer.
O objetivo final deste script é encontrar todos os arquivos de log na estrutura de diretórios de log, verificar se não é o log de hoje, bzip-lo no lugar e excluir o log de texto. Ele seria executado uma vez imediatamente para cuidar de todos os logs antigos e, em seguida, adicionado ao crontab para ser executado logo após a meia-noite todos os dias.
O que preciso fazer para corrigir meu script? Ou existe melhor maneira?
A única restrição real é que é um servidor freebsd, então ele precisa usar sh ou csh, e usar ferramentas freebsd (significando, por exemplo, o achado do bsd ao invés do GNU find que possui opções mais extensas).