Для цього створений інструмент:
truncate -s 0 filename
Це очистить вміст, але все одно це буде той самий файл (the inode залишається таким же).
Це важливо, оскільки деякі програми містять ручку до файлу "by inode". Припустимо, ви "порожні" файли використовуєте наївний метод видалення та відтворення файлу. Деякі програми все ще можуть містити ручку до старого файлу (зі старим вмістом), навіть якщо він більше не видно за звичайні засоби, наприклад ls.
Кінець посилань на більш детальну інформацію в кінці цієї відповіді.
Ще один спосіб, можливо, простіше запам'ятати:
echo -n > filename
Це також зберігає ту саму індезу.
Зауважте, що і те, truncateі інше echo -nне визначене POSIX .
Для відповідності POSIX використовуйте cat /dev/null:
cat /dev/null > filename
Ще один спосіб, більш незрозумілий і, мабуть, не агностичний:
> filename
Якщо файл для врізання потребує кореневих привілеїв для запису, то наступні рядки не працюватимуть, як імовірно, очікувалося:
sudo echo -n > filename
sudo cat /dev/null > filename
sudo > filename
Це тому, що перенаправлення здійснюється оболонкою ще до того, як буде виконано sudo. Це означає, що доступ для запису до файлу здійснюється за допомогою привілеїв користувача, який управляє оболонкою, а не привілеїв, які будуть надані sudo.
Вирішення проблеми полягає у відкладенні перенаправлення на оболонку, виконану з використанням привілеїв sudo, таких як:
sudo sh -c "echo -n > filename"
Використання truncateне потребує такого вирішення, оскільки доступ до запису не робиться оболонкою, а truncateвиконується судо, використовуючи привілеї sudo.
sudo truncate -s 0 filename
Деякі відомості про програми, що містять файл відкритим, навіть якщо файл був видалений, ви можете прочитати наступне:
tail -n +1000 file.txt > file.txtслід видалити 1000 рядків і зберегти нові файли у файлі (ви ніколи не знаєте, коли вам знадобиться якийсь останній запис, щоб щось відстежувати).