Команда split в Linux
splitsplit — это встроенный в Linux инструмент для разделения файлов, который может разделить файл по количеству строк, размеру или заданному количеству.
splitКоманда используется для разделения большого файла на несколько меньших файлов, что упрощает их передачу, хранение или параллельную обработку.
Разделённые файлы можно собрать обратно с помощьюcatкоманды, чтобы объединить их обратно в исходный файл.
Когда лог-файлы слишком велики, чтобы открыть их в редакторе, когда большой файл нужно загружать по частям или когда данные нужно обрабатывать параллельно,splitsplit — предпочтительное решение.
Файлы, создаваемые split, по умолчанию именуются сxaa、xab、xacи другими буквенными последовательностями.
splitsplit не удаляет и не изменяет исходный файл, поэтому операция разделения безопасна. Однако при разделении на множество небольших файлов убедитесь, что на диске достаточно места.
Синтаксис команды
splitБазовый синтаксис команды split выглядит следующим образом:
split [选项] [输入文件] [输出文件前缀]
Если входной файл не указан, данные читаются из стандартного ввода.
Если префикс выходного файла не указан, префикс по умолчаниюxиспользуется.
splitНиже перечислены общие параметры команды split:
| Опция | Описание | Пример |
|---|---|---|
-b, --bytes=大小 | Разделить файл по указанному количеству байтов | split -b 100M large.log |
-l, --lines=行数 | Разделить файл по указанному количеству строк | split -l 1000 data.txt |
-n, --number=数量 | Разделить на указанное количество небольших файлов | split -n 5 data.txt |
-a, --suffix-length=N | Указать длину суффикса (по умолчанию 2) | split -a 3 -l 100 data.txt |
-d, --numeric-suffixes | Использовать числовые суффиксы вместо буквенных | split -d -l 100 data.txt |
-C, --line-bytes=大小 | Разделять по размеру, сохраняя целостность каждой строки | split -C 10M log.txt |
--verbose | Отображать подробную информацию о процессе разделения | split --verbose -b 10M file.bin |
Поддерживаемые единицы измерения размера включают:K(KB),M(MB)、G(GB)、T(TB) и другие суффиксы.
Разница между -b и -C:
| Опция | Поведение | Сценарий применения |
|---|---|---|
-b | Строго режет по количеству байтов и может усечь строку посередине | Бинарные файлы или сценарии, в которых переносы строк не важны |
-C | Пытается резать по границам строк при достижении ограничения размера, обеспечивая целостность каждой строки | Текстовые логи, CSV и другие сценарии, где строки должны оставаться целыми |
При разделении текстовых файлов предпочитайте
-Cover-bизбегать обрезания строки и её разрыва между двумя файлами.
Подробное использование
Разбиение по количеству строк
Разбиение по количеству строк — наиболее интуитивный способ и подходит для обработки лог-файлов или CSV-данных.
# 生成一个包含 5000 行的测试文件 $ seq 1 5000 > data.txt # 每 1000 行拆分为一个小文件 $ split -l 1000 data.txt part_ # 查看生成的文件 $ ls -lh part_* -rw-r--r-- 1 example example 3.9K May 19 14:30 part_aa -rw-r--r-- 1 example example 3.9K May 19 14:30 part_ab -rw-r--r-- 1 example example 3.9K May 19 14:30 part_ac -rw-r--r-- 1 example example 3.9K May 19 14:30 part_ad -rw-r--r-- 1 example example 3.9K May 19 14:30 part_ae
После запуска создаётся 5 файлов, в каждом ровно 1000 строк, а в именах файлов используетсяpart_в качестве префикса.
Разбиение по размеру файла
Разбиение по размеру подходит для разделения бинарных файлов или ограничения максимального размера одного файла.
# 生成一个 10MB 的测试文件 $ dd if=/dev/urandom of=test.bin bs=1M count=10 # 按每 2MB 拆分 $ split -b 2M test.bin chunk_ # 查看拆分结果 $ ls -lh chunk_* -rw-r--r-- 1 example example 2.0M May 19 14:32 chunk_aa -rw-r--r-- 1 example example 2.0M May 19 14:32 chunk_ab -rw-r--r-- 1 example example 2.0M May 19 14:32 chunk_ac -rw-r--r-- 1 example example 2.0M May 19 14:32 chunk_ad -rw-r--r-- 1 example example 2.0M May 19 14:32 chunk_ae
Укажите количество разбиений
Используйте-nчтобы равномерно разделить файл на указанное количество небольших файлов.
# 将文件均分为 3 份 $ split -n 3 data.txt equal_ # 查看各文件行数 $ wc -l equal_* 1667 equal_aa 1667 equal_ab 1666 equal_ac 5000 total
Файл распределяется по возможности равномерно; файл с общим числом 5000 строк делится так, что на каждый файл приходится около 1667 строк.
Если общее количество строк не делится без остатка, в первых файлах оказывается на несколько строк больше, а в последних — на несколько строк меньше.
Использование числовых суффиксов
Буквенный суффикс по умолчанию (aa、ab...) недостаточно интуитивен; можно использовать-dчтобы переключиться на числовые суффиксы.
# 使用数字后缀,并指定后缀长度为 3 $ split -d -a 3 -l 1000 data.txt example_ # 生成的文件名 $ ls example_* example_000 example_001 example_002 example_003 example_004
Здесь длина суффикса 3 означает, что поддерживается до 1000 файлов (от 000 до 999). При разбиении на множество небольших файлов можно увеличить значение-aпараметр.
Разбиение текста с сохранением целостности строк
Используйте-Cчтобы разбивать по размеру, гарантируя, что ни одна строка не будет обрезана.
# 生成一个包含不同长度行的测试日志 $ for i in $(seq 1 100); do echo "Line $i: EXAMPLE testing data $(head -c $((RANDOM % 50 + 10)) /dev/urandom | base64)"; done > log.txt # 按 1KB 拆分,同时保持行完整性 $ split -C 1K log.txt log_ # 检查每个文件的最后一行是否完整(都以换行符结尾) $ for f in log_*; do echo "$f: $(tail -c 1 $f | xxd | grep -c '0a')"; done
-CЭто гарантирует, что последняя строка каждого разбитого файла является полной, и строки никогда не разрезаются пополам.
Объединение разбитых файлов
Разбитые файлы можно объединить без потерь, чтобы восстановить исходный файл:
# 合并所有拆分文件,还原为原始文件 $ cat part_* > restored.txt # 验证合并后的内容与原始文件一致 $ diff data.txt restored.txt && echo "文件一致,合并成功" 文件一致,合并成功
При объединении,catcat объединяет их в алфавитном порядке раскрытия подстановочных знаков оболочки, что в точности и естьsplitпорядок, в котором split создаёт файлы.
ЧАВО
Файлы, созданные split, по-прежнему занимают столько же суммарного места на диске, сколько и исходный файл (на самом деле есть некоторые дополнительные накладные расходы на метаданные файловой системы), поэтому убедитесь, что свободного места на диске достаточно.
При использовании числовых суффиксов, если количество файлов, созданных split, превышает максимальное число, представимое длиной суффикса (например,
-a 2до 100 файлов),splitsplit завершится с ошибкой. Увеличьте значение-aпараметра, чтобы исправить это.
Если вам нужно разделить по определённому содержимому (например, по разделителю),splitsplit не поддерживает это; используйтеcsplitвместо этого команду csplit.
При чтении данных из стандартного ввода,splitsplit не может оценить общий размер, поэтому-nопция для указания количества разбиений не поддерживает режим стандартного ввода.
Связанные команды
| Команда | Описание |
|---|---|
cat | Объединить файлы или вывести содержимое файла |
csplit | Разделить файлы по содержимому (регулярное выражение) |
wc | Подсчитать строки, слова и байты в файле |
dd | Преобразовать и скопировать файлы, а также извлечь данные по размеру блока |
head | Вывести начало файла |
tail | Вывести конец файла |
Справочник команд Linux