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: