- Изучаем команды linux: split
- 1. Введение
- 2. Часто используемые опции
- 3. Разрезание файла на части заданного размера
- 4. Разрезание файла на заданное количество частей
- 5. Использование числовых суффиксов
- 6. Восстановление исходного файла
- 7. Разрезание архивов tar на лету
- 8. Заключение
- Кратко: split — разделяем файлы
- Как разделить большой архив на несколько файлов по 15gb?
- А как сделать тоже самое, только с нормальным именем?
- Как заменить эти aa ab на цифры?
- Что еще можно сделать с суффиксом?
- Как разделить архив на два файла?
- А как теперь собрать все части в один архив?
- Как понять, что делает эта утилита?
- Как split работает с текстовыми файлами?
- Как мне разделить файл на несколько файлов по 3000 строк?
- Как разделить текстовый файл по 300кб не ломая структуру?
- Как разделить файл на основе определенного контента?
- csplit: лучший способ разделения файла в Linux на основе его содержимого
- Использование csplit для разделения файлов в Linux
- Больше шаблонов csplit
- Пропуск данных в csplit
- Использование смещений при расщеплении файлов с помощью csplit
- Разделить по номеру строки
- Чтение из stdin
Изучаем команды linux: split
1. Введение
Если вы не слышали о команде split, вы многое потеряли. Как можно понять из ее названия, эта команда может помочь вам разделить файл на несколько меньших файлов. split работает с любыми файлами, как текстовыми, так и бинарными. Это очень полезно, если ваш файл не помещается на флешку, или вам нужно отправить большой файл по электронной почте. Вы также можете разделять большие текстовые файлы, такие как логи, на несколько частей заданного размера. В данной статье описан синтакис и применение команды split.
2. Часто используемые опции
-b, —bytes=SIZE
Эта опция задает размер выводимых файлов.
-d, —numeric-suffixes
использовать цифровые суффиксы вместо алфавитных
-n, —number=CHUNKS
задает количество выводимых файлов
3. Разрезание файла на части заданного размера
Если не используется опция suffix, по умолчанию команда split будет разделять файлы на части, название которых будет начинаться с x, за которым будут следовать еще два символа в алфавитном порядке. Например, первый файл будет называться xaa, за которым будет идти xab, xac, а последний файл будет называться xzz. Это значит, что в данном случае вы можете разбить свой файл не более чем на 676 частей (26×26). Возьмем для примера файл размером 10 Мб:
Теперь мы можем разбить этот файл на части размером 1 Мб с помощью опции -b:
4. Разрезание файла на заданное количество частей
Также может возникнуть ситуация, когда нам нужно разбить файл на определенное количество частей. В приведенном ниже примере мы разрезаем наш файл размером 10 Мб на максимум три части с помощью опции -n:
5. Использование числовых суффиксов
Команда split позволяет создавать файлы с числовыми суффиксами вместо символьных. Приведенная ниже команда создает файл для каждого символа в строке «linuxcareer.com». Секрет заключается в том, что мы разрезаем файл, задавая размер части в байтах, а 1 байт эквивалентен 1 символу. Также вместо символьных мы используем числовые суффиксы:
6. Восстановление исходного файла
Разрезать файл легко, но как собрать его обратно? Допустим, у нас есть какой-либо ISO-образ, и мы хотим разделить его пополам.
Теперь мы разрезаем образ пополам с помощью опции -n:
Мы можем восстановить исходный файл ubuntu-12.04.1-server-amd64.iso, используя команду cat и оператор перенаправления STDOUT:
Чтобы убедиться, что файл restored-ubuntu-12.04.1-server-amd64.iso восстановлен корректно и представляет собой точную копию оригинального файла ubuntu-12.04.1-server-amd64.iso, мы используем команду md5sum для создания контрольной суммы обоих файлов:
Как вы можете видеть, восстановленный файл является точной копией исходного, так как их контрольные суммы совпадают.
7. Разрезание архивов tar на лету
Теперь, когда мы ознакомились с основами, рассмотрим более сложный пример.
В приведенном ниже примере мы архивируем директорию /tmp/Software. Однако вместо создания архива мы разрежем его на лету с помощью команды split.
Как вы можете видеть, наш архив диретории /tmp/Software разрезан на части с максимальным размером 2 Мб. Далее мы восстановим исходную директорию:
8. Заключение
Как вы можете видеть, при использовании операционной системы GNU/Linux вы ограничены только своим воображением и навыками, а не размером вашего кошелька. В данной статье описаны только основы работы с командой split. Узнать больше вы можете с помощью команды:
Источник
Кратко: split — разделяем файлы
Давненько я тут не писал, хотя заметок накопилось немало.. и начну я пока с кратких заметок. Сегодня речь пойдет об утилите split. Данная утилита позволяет разбивать файлы на несколько частей.
Когда это может быть полезным? Ну к примеру вам может потребоваться разделить большой лог-файл для того, чтобы было удобнее анализировать его на наличие ошибок. Второй вариант — разделить большой архив (что мне и потребовалось) для того, чтобы загрузить его частями на облако, в котором есть ограничения по размеру файлов…
Ниже будет представлено несколько вариантов использования этой утилиты, и начну я с самого распространенного.
Как разделить большой архив на несколько файлов по 15gb?
Самый простой способ:
В результате вы получите файлы, начинающиеся с префикса «x»:
А как сделать тоже самое, только с нормальным именем?
В этой ситуации достаточно добавить желаемую маску, указав ее в кавычках после выбранного файла:
В результате архив будет разделен на эти файлы:
Как заменить эти aa ab на цифры?
Вместо «буквенного» суффикса есть и «цифровой». Чтобы им воспользоваться достаточно использовать ключ -d:
Результат будет такой:
Что еще можно сделать с суффиксом?
Можно увеличить его длину (по умолчанию длина суффикса — 2). Сделать это можно, например до 4, с помощью ключа «-a 4»:
Еще можно использовать шестнадцатеричный суффикс, воспользовавшись ключом «-x». Но на нем я не буду останавливаться.
Как разделить архив на два файла?
Тут нам поможет ключ -n:
В результате мы получим два файла, разделенные «пополам» как и хотели:
А как теперь собрать все части в один архив?
Это нельзя сделать с помощью split, но можно с помощью cat. Ниже пример того, как я собрал все части в один архив и сверил размер и чексум оригинального файла и «воссозданного»:
Как мы видим, архив «воссоздан» и готов к распаковке.
Как понять, что делает эта утилита?
На помощь приходит ключ —verbose:
Как split работает с текстовыми файлами?
По умолчанию эта утилита делит файл создавая новый файл, который содержит 1000 строк. К примеру, у меня есть файл который содержит 11266 строк. Вот на сколько файлов/и как он будет разделен:
Как мне разделить файл на несколько файлов по 3000 строк?
Тут нам поможет ключ -l 3000:
Как разделить текстовый файл по 300кб не ломая структуру?
При разделении текстового файла по размеру, используя ключ -b файлы делятся на части не сохраняя структуру, из-за чего начало строки может быть в одном файле, а ее конец — в другом. Решить эту проблему можно указав ключ «-C 300KB» (указываем максимальный размер), который разделит файл на части сохраняя структуру.
Как разделить файл на основе определенного контента?
В этом утилита split нам не поможет, но поможет csplit. Возможно о ней будет написана отдельная статья.
Источник
csplit: лучший способ разделения файла в Linux на основе его содержимого
Главное меню » Операционная система Linux » csplit: лучший способ разделения файла в Linux на основе его содержимого
Это не удобно в ситуациях, когда вам нужно разделить файлы на основе его содержимого, а не на основе размера. Позвольте привести пример.
Мы управляем своими запланированными твитами, используя файлы YAML. Типичный файл твитов содержит несколько твитов, разделенных четырьмя тире:
При импорте их в свою систему нам нужно написать каждый твит в свой собственный файл. Мы делаем это, чтобы не регистрировать повторяющиеся твиты.
Но как разбить файл на несколько частей на основе его содержимого? Вероятно, вы можете получить что-то убедительное, используя команду awk :
Однако, несмотря на относительную простоту, такое решение не очень надежное: например, мы не правильно закрыли различные выходные файлы, поэтому это может очень сильно превысить ограничение на открытые файлы. Или что, если мы забыли разделитель перед самым первым твитом файла? Конечно, все, что можно обработать и зафиксировать в сценарии AWK, за счет усложнения его работы. Но зачем беспокоиться об этом, когда у нас есть инструмент csplit для выполнения этой задачи?
Использование csplit для разделения файлов в Linux
Инструмента csplit является кузеном инструмента split , который можно использовать для разбиения файла на куски фиксированного размера. Но csplit будет определять границы блоков на основе содержимого файла, а не использовать количество байтов.
В этой статье мы продемонстрируем использование команды csplit, а также объясним вывод этой команды.
Так, например, если мы хотим разбить файл твита на основе разделителя —- , то могли бы написать:
Возможно, вы догадались, что инструмент csplit использовал регулярное выражение, предоставленное в командной строке, для идентификации разделителя. И каковы могут быть результаты и 10983 отображаемые на стандартном выходе? Ну, это размер в байтах каждого созданного фрагмента данных.
Подожди минуту! Откуда берутся те имена файлов xx00 и xx01 ? И зачем csplit разбивать файл на две части ? И почему первый кусок данных имеет длину ноль байтов ?
Ответ на первый вопрос прост: xxNN (или более формально xx%02d ) является стандартным форматом имени файла, используемым csplit . Но вы можете изменить это, используя параметры —suffix-format и —prefix . Например, мы могли бы изменить формат на что-то более значимое для наших нужд:
Префикс является обычной строкой, но суффикс является строкой формата, как та, которая используется в стандартной библиотеке C функцией printf . Большинство символов формата будут использоваться дословно, за исключением спецификаций преобразования, которые вводятся знаком процента ( % ) и заканчивается спецификатором преобразования (здесь d ). Между ними формат может также содержать различные флаги и опции. В нашем примере %03d спецификация преобразования означает:
- отобразить номер фрагмента как десятичное целое ( d ),
- в поле ширины трех символов ( 3 ),
- в конце с левой стороны с нулями ( ).
Но это не касается других запросов, которые у нас были выше: так почему у нас есть только два куска, один из которых содержит нулевые байты? Возможно, вы уже нашли ответ на этот последний вопрос самостоятельно: наш файл данных начинается с —- самой первой строки. Таким образом, csplit он считается разделителем, и поскольку перед этой строкой не было данных, он создал пустой первый кусок. Мы можем отключить создание файлов с нулевыми байтами с помощью опции —elide-empty-files :
Ок: больше нет пустых файлов. Но в некотором смысле это результат худший, так как csplit разделяет файл всего на один кусок. Мы едва можем назвать это «разделение» файла, не так ли?
Объяснение этого удивительного результата csplit вовсе не предполагает, что каждый файл должен быть разделен на основе того же разделителя. Фактически, csplit требуется предоставить каждый используемый разделитель. Даже если это несколько раз то же самое:
Мы поместили три (одинаковых) разделителя в командной строке. Итак, csplit определил конец первого фрагмента на основе первого разделителя. Это приводит к тому, что фрагмент длины с нулевым байтом будет удален. Второй фрагмент был разделен следующим совпадением строк. /—-/ . Превращение в кусок на 170 байт. Наконец, третий фрагмент длиной 250 байтов был идентифицирован на основе третьего разделителя. Остальные данные, 10426 байт, были помещены в последний кусок.
Очевидно, что это было бы нецелесообразно, если бы нам пришлось предоставить столько разделителей в командной строке, сколько в файле данных кусков. Тем более, что это точное число обычно заранее неизвестно. К счастью, csplit имеет специальный шаблон, означающий «повторить предыдущий шаблон как можно больше раз». Несмотря на свой синтаксис, напоминающий звездный квантификатор в регулярном выражении, это ближе к концепции Kleene plus, поскольку он используется для повторения разделителя, который уже встречался один раз:
И на этот раз, наконец, мы разделили свою коллекцию на отдельные части. Однако есть ли в csplip какие-то другие «специальные» шаблоны? Ну, мы не знаем, можем ли мы назвать их «особенными».
Больше шаблонов csplit
Мы только что видели в предыдущем разделе, как использовать квантор ‘<*>’ для несвязанных повторений. Однако, заменив звезду на число, вы можете запросить точное количество повторений:
Это приводит к интересному угловому случаю. Что будет добавлено, если количество повторений превысит количество фактических разделителей в файле данных? Давайте посмотрим на примере:
Интересно, что csplit не только сообщила об ошибке, но и удалила все файлы chunk, созданные во время процесса. Обратите особое внимание на нашу формулировку: она удалила их. Это означает, что файлы были созданы, а затем, csplit столкнувшись с ошибкой, удалила их. Другими словами, если у вас уже есть файл, имя которого выглядит как файл chunk, он будет удален:
В приведенном выше примере файл tweet.002.yaml , который мы создали вручную, был перезаписан, а затем удален csplit .
Вы можете изменить это поведение с помощью опции —keep-files . Как следует из названия, оно не будет удалять куски csplit, созданные после обнаружения ошибки:
Обратите внимание, что в этом случае, несмотря на ошибку, csplit не отбрасывает данные:
Но что, если в файле есть какие-то данные, которые мы хотим пропустить? csplit имеет ограниченную поддержку для этого, используя шаблон %regex% .
Пропуск данных в csplit
При использовании символа процента ( % ) в качестве разделителя регулярных выражений вместо косой черты ( / ) csplit будет пропускаться данные до (но не включая) первой строки, соответствующей регулярному выражению. Это может быть полезно при игнорировании некоторых записей, особенно в начале или в конце входного файла:
Использование смещений при расщеплении файлов с помощью csplit
При использовании регулярных выражений ( /…/ или %…% ) вы можете указать положительное ( +N ) или отрицательное ( -N ) смещение в конце шаблона, так чтобы csplit разделил файл на N строк после или до соответствующей строки. Помните, что во всех случаях шаблон указывает конец фрагмента:
Разделить по номеру строки
Мы уже видели, как мы можем использовать регулярное выражение для разделения файлов. В этом случае csplit разделит файл в первой строке, соответствующей этому регулярному выражению. Но вы также можете определить разделительную линию по номеру строки, как мы ее увидим сейчас.
Прежде чем переключиться на YAML, мы использовали для хранения запланированных твитов в плоском файле.
В этом файле твит был сделан из двух строк. Один из них содержит необязательное повторение, а второй содержит текст твита, причем новые строки заменены на \n. Еще раз, что образец файла доступен в Интернете.
С этим форматом «фиксированного размера» тоже можно было использовать, csplit чтобы поместить каждый отдельный твит в свой собственный файл:
Приведенный выше пример кажется легко понятным, но здесь есть две подводные камни. Во- первых, 2 дано в качестве аргумента csplit является строка номер, не линия подсчета. Однако при использовании повторения, как мы сделали, после первого совпадения csplit будет использовать это число в качестве счетчика строк. Если это не ясно, мы позволим вам сравнить выходные данные трех следующих команд:
Мы упомянули о второй ловушке, несколько связанной с первой. Возможно, вы заметили пустую строку в самой верхней части файла tweets.txt ? Это приводит к тому фрагменту tweet.000.txt , который содержит только символ новой строки. К сожалению, это требовалось в этом примере из-за повторения: помните, что мне нужны две строки. Таким образом, 2 это обязательное условие перед повторением. Но это также означает, что первый фрагмент будет разбит, но не включает в себя вторую строку. Другими словами, первый фрагмент содержит одну строку. Все остальные будут содержать 2 строки. Возможно, вы могли бы поделиться своим мнением в разделе комментариев, но, по моему мнению, это был неудачный выбор дизайна.
Вы можете уменьшить эту проблему, перейдя непосредственно к первой непустой строке:
Чтение из stdin
Конечно, как и большинство инструментов командной строки, csplit можно считывать входные данные со своего стандартного ввода. В этом случае вы должны указать — в качестве входного имени файла:
И это все, что мы хотели показать вам сегодня. Надеюсь, в будущем вы будете использовать csplit для разделения файлов в Linux. Если вам понравилась эта статья и не забывайте делиться ею в своей любимой социальной сети!
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Источник