У меня есть файл (file.txt). Данные добавляются к нему каждую минуту. Теперь размер файла становится все больше и больше. Я хочу, чтобы всякий раз, когда размер файла превышает 800 МБ, все строки сверху удалялись. Как это можно сделать в Perl?
Если вы используете систему unixy, используйте logrotate
Похоже, это основано на распространенном заблуждении новичков о том, как организованы файлы. В большинстве систем единственный способ «обрезать с начала» — это перезаписать весь файл, начиная с первого байта, который вы хотите сохранить. Ни одна распространенная файловая система не имеет операции по перемещению начала файла в новое место без его перезаписи.
@triplee linux имеет Fallocate(2) с FALLOC_FL_COLLAPSE_RANGE, но степень детализации может быть ограничена кратным размеру логического блока
Да, возможно, мне следовало бы сказать «на произвольную новую позицию», чего обычно хотят новички.
Ищи до точки 800мб с конца. Найдите начало записи журнала рядом с этой точкой. Запишите все оттуда до конца файла во временный и замените им оригинал. Найдите способ предотвратить запись большего количества записей в журнал, пока вы это делаете. Когда вы закончите, убедитесь, что новые записи журнала записываются в новый файл, а не в предыдущий.
Непроверено, усекается с начала на 1024 байта. fallocate -v -p -o 0 -l 1024 file.txt





В приведенном ниже коде, когда размер файла (/home/file.txt) превышает 724775731 байт, все строки, кроме последних 3000000 файлов, будут удалены.
use strict;
use warnings;
my $fileToClean = "/home/file.txt";
if (-s "${fileToClean}" > 724775731) {
print "$fileToClean is going to be cleaned now as it has crossed the desired file size\n";
`echo -e '1,-3000000d\nwq' | ed $fileToClean`
}
-s возвращает размер в байтах, а не килобайтах.
Вы также назначаете переменную $sizeInKbs (неправильное имя), но никогда ее не используете. Вместо этого вы выполняете проверку файла дважды. И эта команда оболочки выглядит очень странно, но, к сожалению, я не могу ее расшифровать.
какая операционная система? какая файловая система?