Для этого создан инструмент:
truncate -s 0 filename
Это очистит содержимое, но это будет тот же файл ( индекс останется прежним).
Это важно, потому что некоторые программы хранят дескриптор файла «по индексу». Предположим, вы «очистили» файл, используя наивный метод удаления и повторного создания файла. Некоторые программы могут по-прежнему хранить дескриптор старого файла (со старым содержимым), даже если он больше не виден обычными средствами, например 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.
sudo truncate -s 0 filename
Для некоторых подробностей о программах, которые держат файл открытым, даже если файл был удален, вы можете прочитать следующее:
tail -n +1000 file.txt > file.txtследует удалить 1000 строк и сохранить самые новые строки в файле (вы никогда не знаете, когда вам может понадобиться какая-то последняя запись для отслеживания чего-либо).