У меня есть текстовый файл в моем домашнем каталоге, который регулярно получает данные через задание cron. Поскольку задание cron предоставляет динамические данные, я также хотел бы установить задание cron для очистки содержимого файла (файл должен все еще существовать). Мне не нужна помощь с cron, только команда, которая может помочь с очисткой файла.
Самый простой способ:
> filename
Это менее очевидный способ и, вероятно, менее читаемый в сценарии оболочки другими, но это все, что вам нужно.
Поскольку >
на самом деле не является настоящей командой (это встроенная команда bash), вы не можете использовать:
sudo > filename
, если у вас нет прав для этого файла. Но вы можете использовать:
sudo bash -c "> filename"
Для автоматизации этого вы можете использовать logrotate. Просто создайте файл конфигурации для файла, который вы хотите очистить, добавьте другие настройки, и вы можете автоматически очищать его каждый день в зависимости от критериев, которые вы выбираете каждый день, или когда файл больше чем т. Д.
Посмотрите здесь, как настроить logrotate: http://linuxcommand.org/man_pages/logrotate8.html
echo "" > foo_file
- простой способ сделать это, он заменит все содержимое foo_file на "" , сделав его в этом случае пустым.
Вы также можете использовать cat /dev/null > foo_file
, который будет читать нулевое устройство и перезаписывать ваш файл вообще ничем.
Для этой цели создан инструмент:
truncate -s 0 filename
Он удалит содержимое, но он останется тем же файлом (индекс останется прежним).
] Это важно, потому что некоторые программы хранят дескриптор файла «по индексу». Предположим, вы «очистили» файл, используя наивный метод удаления и повторного создания файла. Некоторые программы могут по-прежнему хранить дескриптор старого файла (со старым содержимым), даже если он больше не виден обычными средствами, такими как 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
Некоторые подробности о программах, которые держат файл открытым, даже если файл был удален, вы можете прочитать в следующем: