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 "by 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, como os meios usuais ls.
Alguns links para mais detalhes no final desta resposta.
Outra maneira, talvez mais fácil de lembrar:
echo -n > filename
Isso também mantém o mesmo inode.
Observe que ambos truncatee echo -nnão são definidos pelo POSIX .
Para uso em conformidade com POSIX cat /dev/null:
cat /dev/null > filename
Ainda outra maneira, mais obscura e provavelmente não agnóstica:
> filename
Se o arquivo a truncar precisar de privilégios de root para gravar, as seguintes linhas 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 antes mesmo 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"
truncateVocê não precisa usar essa solução alternativa, porque o acesso de gravação não é feito pelo shell, mas pelo truncatequal é executado pelo sudo usando privilégios de sudo.
sudo truncate -s 0 filename
Para obter alguns detalhes sangrentos sobre programas que mantêm o arquivo aberto, mesmo que o arquivo tenha sido excluído, você pode ler o seguinte:
tail -n +1000 file.txt > file.txtremova 1000 linhas e mantenha as linhas mais recentes no arquivo (você nunca sabe quando poderá precisar de parte do registro recente para rastrear algo).