Опорожнение содержимого текстового файла

9

У меня есть текстовый файл в моем домашнем каталоге, который регулярно получает данные с помощью задания cron. Поскольку задание cron предоставляет динамические данные, я также хотел бы установить задание cron для опорожнения содержимого файла (файл все равно должен существовать). Мне не нужна помощь с cron, просто команда, которая может помочь с опорожнением файла.

    
задан sosytee 12.09.2013 в 08:42
источник

4 ответа

15

Самый простой способ:

> filename

Это менее очевидный способ и, вероятно, менее читаемый в сценарии оболочки другими, но это все, что вам нужно.

Поскольку > на самом деле не является действительно командой (она встроена в bash), вы не можете использовать:

sudo > filename

, когда у вас нет прав на этот файл. Но вы можете использовать:

sudo bash -c "> filename"
    
ответ дан Radu Rădeanu 12.09.2013 в 10:08
источник
13

Для этой цели создан инструмент:

truncate -s 0 filename

Это очистит содержимое, но все равно будет тот же файл ( inode остается тем же).

Это важно, потому что некоторые программы содержат дескриптор файла «inode». Предположим, вы «пустили» файл, используя наивный метод удаления и воссоздания файла. Некоторые программы могут по-прежнему держать дескриптор старого файла (со старым контентом), даже если он больше не отображается в обычном виде, например, ls .

Некоторые ссылки на более подробные сведения в конце этого ответа.

Другой способ, возможно, легче запомнить:

echo -n > filename

Это также поддерживает тот же индекс.

Обратите внимание, что оба truncate и echo -n не определены POSIX .

Для использования POSIX используйте cat /dev/null :

cat /dev/null > filename

Еще один способ, более неясный и, вероятно, не агностик оболочки:

> filename

Если файл для обрезания требует прав root для записи, тогда следующие строки не будут работать, как ожидалось:

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

Для некоторых подробностей о программах, открывающих файл, даже если файл был удален, вы можете прочитать следующее:

ответ дан lesmana 12.09.2013 в 08:46
4

Чтобы автоматизировать это, вы можете использовать logrotate. Просто создайте файл конфигурации для файла, который вы хотите очистить, добавьте другие настройки, и вы можете автоматически его очищать каждый день автоматически на основе критериев, которые вы выбираете f.e каждый день, или когда файл больше и т. Д.

Посмотрите здесь, как настроить logrotate: Ссылка

    
ответ дан piotrektt 12.09.2013 в 09:50
3

echo "" > foo_file - это простой способ сделать это, он заменит все содержимое foo_file на "" , сделав его в этом случае пустым.

Вы также можете использовать cat /dev/null > foo_file , который будет считывать нулевое устройство и вообще не записывать ваш файл.

    
ответ дан Bruno Pereira 12.09.2013 в 08:45