Назад | Перейти на главную страницу

Как периодически удалять весь контент из файла, не удаляя его

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

Я пробовал это:

Создан cron, который выполняет следующий скрипт

other lines from the script here

sed '1,14d' file.txt>file.txt

Если я запускаю его с терминала, он работает нормально, но когда я запускаю cron, он выполняет первую часть (часть «другие строки из сценария здесь»), но не очищает файл.

Примечание. Файл имеет 777 разрешений, поэтому я не думаю, что это связано с разрешениями.

Вы можете попробовать простой> file.txt

$ cat file.txt
this is a test
$ >file.txt
$cat file.txt
$

Вы также можете использовать logrotate, что дает вам возможность не просто очистить файл, но и заархивировать (например, сжать) предыдущее содержимое файла и даже отправить файл вам по почте.

Возможно, текущий рабочий каталог не тот, который вы ожидаете, когда cron выполнит скрипт. Попробуйте указать полный путь к файлу file.txt. Кроме того, это также должно очистить файл на случай, если с командой sed возникнет какая-то проблема:

echo > file.txt

Традиционный un * x способ «очистить» файл:

$ cat /dev/null > myfile

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

$ cp myfile myfile-$(date '+%F') && cat /dev/null > myfile

И, как уже упоминалось, задания cron обычно не выполняются в ожидаемом каталоге; но вы можете «cd» перейти к желаемому каталогу в скрипте, чтобы выполнить работу и по-прежнему использовать относительные пути.

Я бы сделал это: mv file file.bak && touch file && rm file.bak

Я сначала перемещаю файл, на случай, если в системе он будет открыт.

Вы даже можете использовать truncate (1), если он есть в вашей системе.