Linux обрезать файл по размеру

Обновлено: 04.07.2024

У меня есть большое количество файлов, некоторые из которых очень длинные. Я хотел бы обрезать их до определенного размера, если они больше, удалив конец файла. Но я хочу только удалить целые строки. Как я могу это сделать? Это похоже на то, что будет обрабатываться инструментарием Linux, но я не знаю правильной команды.

Например, скажем, у меня есть файл размером 120000 байт с 300-байтовыми строками, и я пытаюсь обрезать его до 10000 байт. Первые 33 строки должны остаться (9900 байт), а остальные должны быть обрезаны. Я не хочу точно вырезать 10 000 байт, так как это оставит частичную строку.

Конечно, файлы имеют разную длину, а строки имеют разную длину.

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

Удален мой ответ . Я думаю, размер файла в байтах был не слишком ясен, извините. Может быть, вы могли бы отредактировать свой вопрос и уточнить эту часть (например, с примером)? Не беспокойтесь, я должен был просто спросить, извините :)

sed / wc Сложность можно избежать в предыдущих ответах , если awk используется. Используя пример, предоставленный из OP (показаны полные строки до 10000 байт):

Также показывает полную строку, содержащую 10000-й байт, если этот байт не находится в конце строки:

Ответ выше предполагает:

  1. Текстовый файл имеет терминатор строки Unix ( \n ). Для текстовых файлов Dos / Windows ( \r\n ) измените length() + 1 на length() + 2
  2. Текстовый файл содержит только однобайтовый символ. Если есть многобайтовые символы (например, в среде Unicode), установите в среде LC_CTYPE=C принудительную интерпретацию на уровне байтов.

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

Пояснение: sed это процессор регулярных выражений. С указанным параметром -i он обрабатывает файл напрямую («inline»), а не просто читает его и записывает результаты в стандартный вывод. 100,$ просто означает «от строки 100 до конца файла» - и сопровождается командой d , которую вы, вероятно, догадались правильно, чтобы заменить «удалить». Короче говоря, команда означает: «Удалить все строки из строки 100 до конца файла из myfile.txt». 100 - это первая строка, которую нужно удалить, так как вы хотите сохранить 99 строк.

Изменить: Если, с другой стороны, есть файлы журналов, где вы хотите сохранить, например, последние 100 строк:

Что здесь происходит:

  • [ $(wc -l myfile.txt) -gt 100 ] : делать следующее, только если файл содержит более 100 строк
  • $((100 - $(wc -l myfile.txt|awk ''))) : вычислить количество удаляемых строк (т.е. сохранить все строки файла, кроме (последних) 100)
  • 1, $((..)) d : удалить все строки от первой до расчетной

РЕДАКТИРОВАТЬ: так как вопрос был только что отредактирован, чтобы дать больше деталей, я включу эту дополнительную информацию вместе с моим ответом. Добавлены факты:

  • конкретный размер должен оставаться в файле (10 000 байт)
  • каждая строка имеет определенный размер в байтах (300 байтов в примере)

Из этих данных можно рассчитать количество строк, которые останутся как "/", что в примере будет означать 33 строки. Термин оболочки для вычисления: $((size_to_remain / linesize)) (по крайней мере в Linux, использующем Bash, результат - целое число). Настроенная команда теперь будет выглядеть так:

Поскольку размеры известны заранее, больше нет необходимости в вычислениях, встроенных в sed команду. Но для большей гибкости внутри некоторого сценария оболочки можно использовать переменные.

Для условной обработки, основанной на размере файла, можно использовать следующую «тестовую» конструкцию:

что означает: «если размер $file превышает 100 КБ, делайте . » ( ls -lk перечисляет размер файла в КБ в позиции 5, следовательно awk , используется для извлечения именно этого).

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

Усечение файла происходит намного быстрее и проще, чем удаление файла , его воссоздание и установка правильных прав доступа и владельца . Кроме того, если файл открывается процессом, удаление файла может привести к сбою в работе программы, которая его использует.

Shell Redirection

Самый простой и наиболее используемый метод для усечения файлов - это использование > - оператора перенаправления оболочки.

Общий формат для усечения файлов с использованием перенаправления:

  • В : средстве толстой кишки true и не производит никакого вывода.
  • Оператор > перенаправления перенаправляет вывод предыдущей команды в указанный файл.
  • filename , файл, который вы хотите усечь.


Если файл существует , он будет обрезан до нуля. В противном случае файл будет создан.

Вместо : можно также использовать другую команду, которая не выдает никаких результатов.

Вот пример использования cat команды для вывода содержимого /dev/null устройства, которое возвращает только символ конца файла:

Еще одна команда, которая может быть использована echo . -n Опция говорит echo не для добавления новой строки:

В большинстве современных оболочек, таких как Bash или Zsh, вы можете опустить команду перед символом перенаправления и использовать:

Чтобы иметь возможность обрезать файл, вам необходимо иметь права на запись в файл. Обычно вы бы использовали sudo для этого, но привилегии суперпользователя не применяются к перенаправлению. Вот пример:


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

Другой вариант - передать вывод в tee команду, повысить tee привилегии sudo и записать пустой вывод в заданный файл:

truncate команда

truncate утилита командной строки, которая позволяет уменьшить или расширить размер файла до заданного размера.

Общий синтаксис для усечения файлов до нулевого размера с помощью truncate команды, выглядит следующим образом:

Например, чтобы очистить журнал доступа Nginx, вы должны использовать:


Очистить все файлы журнала

Со временем ваш диск может загромождаться большим количеством больших файлов журнала, занимающих много места на диске.

Следующая команда очистит файлы, заканчивающиеся на «.log» в /var/log каталоге:

Лучшим вариантом будет вращение, сжатие и удаление файлов журналов с помощью logrotate инструмента.

Вывод

Чтобы обрезать файл в Linux, используйте оператор перенаправления, > за которым следует имя файла.

Favorite

Добавить в избранное

Как обрезать (очистить) файлы в Linux

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

Усечение файла происходит намного быстрее и проще, чем удаление файла , его воссоздание и установка правильных прав доступа и владельца. Кроме того, если файл открывается процессом, удаление файла может вызвать сбой программы, которая его использует.

В этой статье объясняется, как обрезать файлы до нулевого размера в системах Linux с помощью перенаправления оболочки и команды truncate.

Перенаправление оболочки

Общий формат для усечения файлов с использованием перенаправления:

Давайте разберем команду:

  • : означает true и не производит никакого вывода.
  • Оператор перенаправления > перенаправляет вывод предыдущей команды в указанный файл.
  • filename, файл, который вы хотите усечь.

Если файл существует, он будет обрезан до нуля. В противном случае файл будет создан.

Вместо :можно также использовать другую команду, которая не выдает никаких результатов.

Вот пример использования catкоманды для вывода содержимого устройства /dev/null, которое возвращает только символ конца файла:

Еще одна команда, которая может быть использована echo. Опция -n говорит echo не для добавления новой строки:

В большинстве современных оболочек, таких как Bash или Zsh, вы можете опустить команду перед символом перенаправления и использовать:

Чтобы иметь возможность усекать файл, вам необходимо иметь права на запись в файл. Обычно вы бы использовали sudoдля этого, но привилегии суперпользователя не применяются к перенаправлению. Вот пример:

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

Читать Как запустить удаленно SSH команды в Linux и показать результат локально

Команда truncate

truncate это утилита командной строки, которая позволяет уменьшить или расширить размер файла до заданного размера.

Общий синтаксис для усечения файлов до нулевого размера с помощью truncateкоманды, выглядит следующим образом:

Параметр -s 0 задает размер файла до нуля.

Например, чтобы очистить журнал доступа Nginx, вы должны использовать:

Очистить все файлы журнала

Со временем ваш диск может загромождаться большим количеством больших файлов журнала, занимающих много места на диске.

Следующая команда очистит файлы, заканчивающиеся на «.log» в каталоге /var/log:

Лучшим вариантом будет вращение, сжатие и удаление файлов журналов с помощью инструмента logrotate.

Заключение

Чтобы обрезать файл в Linux, используйте оператор перенаправления >, за которым следует имя файла.

Если у вас есть какие-либо вопросы или замечания, пожалуйста, оставьте комментарий ниже.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

У меня есть большой (по количеству строк) текстовый файл, который я хотел бы разделить на файлы меньшего размера, также по количеству строк. Поэтому, если в моем файле около 2 млн строк, я хотел бы разделить его на 10 файлов, содержащих 200 тыс. строк, или 100 файлов, содержащих 20 тыс. строк (плюс один файл с остатком; равномерность деление не имеет значения).

Для этого можно написать скрипт на PHP или Python, но если вы используете Bash, то вы можете воспользоваться готовой утилитой split, которая умеет разбивать как текстовые, так и бинарные файлы на части указанного размера. Если это текстовый файл, то можно разбить большой файл на файлы равного размера с определённым количеством строк. Эта статья расскажет как пользоваться командой split.

Как разбить текстовый файл на файлы с определённым количеством строк

Чтобы разбить файл по числу строк, выполните команду вида:


Как разбить файлы на тома определённого размера

Если вы хотите разбить файлы по размеру, то используйте опцию -C (файлы будут разбиты по строкам, разрывов строк не будет)

Команда split обычно работает со строками ввода (то есть из текстового файла). Но если мы используем параметр -b, мы заставляем split рассматривать файл как двоичный ввод, а строки игнорируются. Мы можем указать размер файлов, которые мы хотим, вместе с префиксом, который мы хотим для выходных файлов. split также может использовать параметр -d, чтобы дать нам числовую нумерацию (*.01 , *.02 , *.03 и т. д.) для выходных файлов, а не алфавитную, которая применяется по умолчанию (*.aa , *.ab , *.ac, и т.д.). Параметр -a указывает длину суффикса. Команда выглядит так:

где ЧИСЛО — длина расширения (или суффикса), которое мы будем использовать, а РАЗМЕР — это размер результирующих файлов с модификатором единиц (K, M, G и т. д.). К примеру, разделим образ диска на файлы размером 4 ГБ с помощью следующей команды (размер последнего файла будет соответствовать оставшейся части тома, если он не является точно кратным выбранному вами размеру):

Это приведёт к созданию группы файлов (размером 4 ГБ), каждый из которых будет назван префиксом case1.split1, как указано в команде, за которым следует .000, .001, .002 и т. д. Параметр -a с 3 указывает, что мы хотим, чтобы расширение было не менее 3 цифр. Без -a 3 наши файлы будут называться .00 , .01 , .02 и т. д. братите внимание на конечную точку в имени нашего выходного файла. Мы делаем это так, чтобы суффикс добавлялся как расширение файла, а не в конец строки имени.

Как файл разделённый на части собрать в один файл

В приведённой выше команде мы повторно собрали разделённые части в новый файл образа размером 80 ГБ. Исходные разделённые файлы не удаляются.

Читайте также: