Esiste uno strumento creato a tale scopo:
truncate -s 0 filename
Questo cancellerà il contenuto ma rimarrà lo stesso file (l' inode rimane lo stesso).
Questo è importante perché alcuni programmi contengono un handle per il file "per inode". Supponiamo di "svuotare" un file usando il metodo ingenuo di eliminare e ricreare il file. Alcuni programmi potrebbero comunque contenere un handle per il vecchio file (con il vecchio contenuto) anche se non è più visibile come al solito ls.
Alcuni link a maggiori dettagli alla fine di questa risposta.
Un altro modo, forse più facile da ricordare:
echo -n > filename
Ciò mantiene anche lo stesso inode.
Si noti che entrambi truncatee echo -nnon sono definiti da POSIX .
Per la conformità POSIX utilizzare cat /dev/null:
cat /dev/null > filename
Ancora un altro modo, più oscuro e probabilmente non shell agnostico:
> filename
Se il file da troncare necessita dei privilegi di root per scrivere, le seguenti righe non funzioneranno come probabilmente previsto:
sudo echo -n > filename
sudo cat /dev/null > filename
sudo > filename
Questo perché il reindirizzamento viene eseguito dalla shell anche prima dell'esecuzione di sudo. Ciò significa che l'accesso in scrittura al file viene effettuato utilizzando i privilegi dell'utente che esegue la shell, non i privilegi che saranno concessi da sudo.
Una soluzione alternativa consiste nel rinviare il reindirizzamento a una shell eseguita utilizzando i privilegi di sudo in questo modo:
sudo sh -c "echo -n > filename"
L'utilizzo truncatedi questa soluzione non è necessario in quanto l'accesso in scrittura non viene eseguito dalla shell ma mediante il truncatequale viene eseguito da sudo utilizzando i privilegi di sudo.
sudo truncate -s 0 filename
Per alcuni dettagli cruenti sui programmi che tengono aperto il file anche se il file è stato eliminato, puoi leggere quanto segue:
tail -n +1000 file.txt > file.txtrimuovere 1000 righe e conservare le righe più recenti nel file (non si sa mai quando potrebbe essere necessario un po 'del record recente per tenere traccia di qualcosa).