Esvaziando o conteúdo de um arquivo de texto

9

Eu tenho um arquivo de texto no meu diretório pessoal que recebe dados regularmente por meio de um cron job. Como a tarefa cron fornece dados dinâmicos, eu também gostaria de definir uma tarefa cron para esvaziar o conteúdo do arquivo (o arquivo ainda deve existir). Eu não preciso de ajuda com o cron, apenas o comando que pode ajudar com o esvaziamento do arquivo.

    
por sosytee 12.09.2013 / 10:42

4 respostas

16

A maneira mais simples:

> filename

Esta é uma maneira menos óbvia e provavelmente menos legível em um script de shell por outros, mas é tudo que você precisa.

Porque > não é realmente um comando (é bash builtin) você não pode usar:

sudo > filename

quando você não tem permissões nesse arquivo. Mas você pode usar:

sudo bash -c "> filename"
    
por Radu Rădeanu 12.09.2013 / 12:08
13

Existe uma ferramenta criada para esse fim:

truncate -s 0 filename

Isso limpará o conteúdo, mas continuará sendo o mesmo arquivo (o inode permanece o mesmo).

Isso é importante porque alguns programas mantêm um identificador para o arquivo "por inode". Suponha que você "esvazie" um arquivo usando o método ingênuo de excluir e recriar o arquivo. Alguns programas ainda podem manter um identificador para o arquivo antigo (com o conteúdo antigo), mesmo que ele não esteja mais visível por meios usuais, como ls .

Alguns links para mais detalhes no final desta resposta.

Outra forma, talvez mais fácil de lembrar:

echo -n > filename

Isso também mantém o mesmo inode.

Observe que truncate e echo -n não estão definidos por POSIX .

Para conformidade com POSIX, use cat /dev/null :

cat /dev/null > filename

Mais uma forma, mais obscura e provavelmente não agnóstica:

> filename

Se o arquivo a ser truncado precisar de privilégios de root para gravar, as linhas a seguir não funcionarão como o esperado:

sudo echo -n > filename
sudo cat /dev/null > filename
sudo > filename

Isso ocorre porque o redirecionamento é feito pelo shell mesmo antes de o sudo ser executado. Isso significa que o acesso de gravação ao arquivo é feito usando os privilégios do usuário que executa o shell, não os privilégios que serão concedidos pelo sudo.

Uma solução alternativa é adiar o redirecionamento para um shell executado usando privilégios sudo como este:

sudo sh -c "echo -n > filename"

Usando truncate você não precisa dessa solução porque o acesso de gravação não é feito pelo shell, mas sim pelo truncate que é executado pelo sudo usando privilégios sudo.

sudo truncate -s 0 filename

Para alguns detalhes sobre os programas que mantêm o arquivo aberto mesmo que o arquivo tenha sido excluído, você pode ler o seguinte:

por lesmana 12.09.2013 / 10:46
4

Para automatizar isso, você pode usar o logrotate. Basta criar um arquivo de configuração para o arquivo que você deseja esvaziar, adicionar outras configurações e esvaziá-lo todos os dias automaticamente com base nos critérios escolhidos todos os dias, ou quando o arquivo for maior que o normal.

Veja aqui como configurar o logrotate: link

    
por piotrektt 12.09.2013 / 11:50
3

echo "" > foo_file é uma maneira simples de fazer isso, ele substituirá todo o conteúdo de foo_file por "" , tornando-se, nesse caso, vazio.

Você também pode usar cat /dev/null > foo_file , que lerá o dispositivo nulo e sobrescreverá seu arquivo sem nada.

    
por Bruno Pereira 12.09.2013 / 10:45