Como remover periodicamente todo o conteúdo de um arquivo sem excluí-lo

3

Eu preciso esvaziar periodicamente um arquivo de texto sem excluí-lo (eu sei quantas linhas ele tem).

Eu tentei isso:

Criado um cron que executa o seguinte script

other lines from the script here

sed '1,14d' file.txt>file.txt

Se eu rodá-lo a partir de um terminal ele funciona bem, mas quando executo o cron ele executa a primeira parte (a parte "outras linhas do script aqui") mas não esvazia o arquivo.

Observação: o arquivo tem 777 permissões, então não acho que ele esteja relacionado a permissões.

    
por zozo 30.03.2011 / 13:23

6 respostas

4

Talvez o diretório de trabalho atual não seja o que você espera quando o cron executa o script. Tente especificar o caminho completo para o arquivo.txt. Além disso, isso também deve esvaziar o arquivo, caso haja algum problema com o comando sed:

echo > file.txt
    
por 30.03.2011 / 13:28
10

Você pode experimentar um arquivo > file.txt simples

$ cat file.txt
this is a test
$ >file.txt
$cat file.txt
$
    
por 30.03.2011 / 13:30
4

Você também pode usar logrotate , que oferece a opção de não apenas esvaziar o arquivo, mas arquivar (por exemplo, compactar) o conteúdo anterior do arquivo e até enviar o arquivo por e-mail para você.

    
por 30.03.2011 / 15:39
2

O modo tradicional un * x de "esvaziar" um arquivo:

$ cat /dev/null > myfile

Movendo o arquivo & tocar um novo arquivo (portanto, alterar o descritor de arquivo) pode impedir que aplicativos existentes continuem a gravar no arquivo, o que geralmente é indesejável. Se uma cópia, se o arquivo existente é necessário, você pode fazer algo como (embora, note que não é atômica, por isso algumas datas podem ser duplicadas em ambos os arquivos):

$ cp myfile myfile-$(date '+%F') && cat /dev/null > myfile

E, como mencionado, as tarefas 'cron' geralmente não são executadas no diretório esperado; mas você pode "cd" para o seu diretório desejado no script para fazer o trabalho & ainda use caminhos relativos.

    
por 05.05.2011 / 00:27
1

Eu faria isso: mv file file.bak && touch file && rm file.bak

Eu movo o arquivo primeiro, caso o sistema esteja aberto.

    
por 30.03.2011 / 19:45
1

Você pode até mesmo usar o truncate (1), se o seu sistema o tiver.

    
por 05.05.2011 / 00:39