Как обрезать файл сверху, чтобы в Perl был файл только определенного размера

У меня есть файл (file.txt). Данные добавляются к нему каждую минуту. Теперь размер файла становится все больше и больше. Я хочу, чтобы всякий раз, когда размер файла превышает 800 МБ, все строки сверху удалялись. Как это можно сделать в Perl?

какая операционная система? какая файловая система?

jhnc 30.05.2024 10:03

Если вы используете систему unixy, используйте logrotate

ikegami 30.05.2024 10:20

Похоже, это основано на распространенном заблуждении новичков о том, как организованы файлы. В большинстве систем единственный способ «обрезать с начала» — это перезаписать весь файл, начиная с первого байта, который вы хотите сохранить. Ни одна распространенная файловая система не имеет операции по перемещению начала файла в новое место без его перезаписи.

tripleee 30.05.2024 10:23

@triplee linux имеет Fallocate(2) с FALLOC_FL_COLLAPSE_RANGE, но степень детализации может быть ограничена кратным размеру логического блока

jhnc 30.05.2024 10:30

Да, возможно, мне следовало бы сказать «на произвольную новую позицию», чего обычно хотят новички.

tripleee 30.05.2024 10:35

Ищи до точки 800мб с конца. Найдите начало записи журнала рядом с этой точкой. Запишите все оттуда до конца файла во временный и замените им оригинал. Найдите способ предотвратить запись большего количества записей в журнал, пока вы это делаете. Когда вы закончите, убедитесь, что новые записи журнала записываются в новый файл, а не в предыдущий.

Shawn 30.05.2024 16:51

Непроверено, усекается с начала на 1024 байта. fallocate -v -p -o 0 -l 1024 file.txt

mpapec 30.05.2024 19:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В приведенном ниже коде, когда размер файла (/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 возвращает размер в байтах, а не килобайтах.
TLP 31.05.2024 12:27

Вы также назначаете переменную $sizeInKbs (неправильное имя), но никогда ее не используете. Вместо этого вы выполняете проверку файла дважды. И эта команда оболочки выглядит очень странно, но, к сожалению, я не могу ее расшифровать.

TLP 03.06.2024 13:38

Другие вопросы по теме