У меня есть текстовый файл в моем домашнем каталоге, который регулярно получает данные через задание cron. Поскольку задание cron предоставляет динамические данные, я также хотел бы установить задание cron для очистки содержимого файла (файл должен все еще существовать). Мне не нужна помощь с cron, только команда, которая может помочь с очисткой файла.
command-line
sosytee
источник
источник
tail -n +1000 file.txt > file.txt
следует удалить 1000 строк и сохранить самые новые строки в файле (вы никогда не знаете, когда вам может понадобиться какая-то последняя запись для отслеживания чего-либо).Ответы:
Самый простой способ:
Это менее очевидный способ и, вероятно, менее читаемый другими пользователями в сценарии оболочки, но это все, что вам нужно.
Потому
>
что на самом деле это не действительно команда (это встроенная команда bash), которую вы не можете использовать:когда у вас нет разрешений на этот файл. Но вы можете использовать:
источник
sudo crontab -e
для добавления задания cron для root, а не для вас. Или изменить разрешение файла на 766 (или 666), а не 755:sudo chmod 766 filename
. Подробнее о: codex.wordpress.org/Changing_File_Permissionstruncate filename
немного чище и проще, чем перенаправление пустого вывода в файл и не сталкивается с проблемами сsudo
.truncate -s 0 filename
действительно может сделать трюк. Вы можете добавить это как ответ.Для этого создан инструмент:
Это очистит содержимое, но это будет тот же файл ( индекс останется прежним).
Это важно, потому что некоторые программы хранят дескриптор файла «по индексу». Предположим, вы «очистили» файл, используя наивный метод удаления и повторного создания файла. Некоторые программы могут по-прежнему хранить дескриптор старого файла (со старым содержимым), даже если он больше не виден обычными средствами, например
ls
.Некоторые ссылки на более подробную информацию в конце этого ответа.
Другой способ, может быть, легче запомнить:
Это также сохраняет тот же индекс.
Обратите внимание, что оба
truncate
иecho -n
не определены POSIX .Для соответствия POSIX используйте
cat /dev/null
:Еще один способ, более неясный и, вероятно, не агностический:
Если для усечения файла требуются права суперпользователя для записи, следующие строки будут работать не так, как ожидается:
Это связано с тем, что перенаправление выполняется оболочкой еще до выполнения sudo. Это означает, что доступ для записи в файл осуществляется с использованием привилегий пользователя, который запускает оболочку, а не привилегий, которые будут предоставлены sudo.
Обходной путь - отложить перенаправление на оболочку, выполняемую с использованием привилегий sudo, например:
Использование
truncate
не требует такого обходного пути, потому что доступ на запись осуществляется не оболочкой, а сtruncate
помощью sudo с использованием привилегий sudo.Для некоторых подробностей о программах, которые держат файл открытым, даже если файл был удален, вы можете прочитать следующее:
источник
Для автоматизации этого вы можете использовать logrotate. Просто создайте файл конфигурации для файла, который вы хотите очистить, добавьте другие параметры, и вы сможете автоматически очищать его каждый день в зависимости от критериев, которые вы выбираете каждый день, или когда размер файла больше, чем т. Д.
Посмотрите здесь, как настроить logrotate: http://linuxcommand.org/man_pages/logrotate8.html
источник
echo "" > foo_file
это простой способ сделать это, он заменит все содержимое foo_file на "", делая его в этом случае пустым.Вы также можете использовать
cat /dev/null > foo_file
, который будет читать нулевое устройство и перезаписывать ваш файл вообще ни с чем.источник