Мне нужно периодически очищать текстовый файл, не удаляя его (я знаю, сколько в нем строк).
Я пробовал это:
Создан 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), если он есть в вашей системе.