CLI AI

Разрезать большой файл на части и собрать обратно

2026-07-28

split -b 10M -d archive.tar.gz archive.tar.gz.part- режет файл на куски по 10 МБ, а cat archive.tar.gz.part-* > restored.tar.gz собирает их обратно. Совпадение размеров ничего не доказывает — честная проверка только по контрольным суммам, и есть флаг, который теряет данные, не сообщая об ошибке.

1. Разрезать по размеру

clai
$ clai разрежь archive.tar.gz на куски по 10 мегабайт→ split -b 10M -d archive.tar.gz archive.tar.gz.part-10485760 archive.tar.gz.part-0010485760 archive.tar.gz.part-014028480 archive.tar.gz.part-02

-b 10M — размер куска, -d просит числовые суффиксы вместо буквенных. Последний кусок меньше остальных, так и должно быть. Сама команда ничего не печатает — размеры выше показаны через ls -l.

2. Собрать обратно

clai
$ clai собери файл обратно из кусков→ cat archive.tar.gz.part-* > restored.tar.gz

Отдельной команды «склеить» не существует: весь фокус в cat по порядку глоба. Именно поэтому важны суффиксы — и числовые, и буквенные, которые генерирует split, всегда сортируются правильно.

3. Доказать, что вышло то же самое

clai
$ clai проверь, что собранный файл совпадает с исходным→ sha256sum archive.tar.gz restored.tar.gz93f9298124fc680c archive.tar.gz93f9298124fc680c restored.tar.gz

Хеши здесь укорочены до 16 символов, чтобы влезли в строку. Одинаковый размер файлов — не доказательство: перевёрнутый байт внутри куска размер не меняет вовсе.

4. Не по размеру, а на число частей

clai
$ clai разрежь файл ровно на три части→ split -n 3 -d archive.tar.gz piece-8333334 piece-008333333 piece-018333333 piece-02

-n делит на равные части, а остаток отдаёт первой. Удобно, когда файл раскидывают по трём носителям, а не подгоняют под лимит загрузки.

5. Оставить контрольную сумму тому, кто будет склеивать

clai
$ clai сохрани контрольную сумму рядом с файлом→ sha256sum archive.tar.gz > archive.tar.gz.sha256

После склейки принимающая сторона запускает sha256sum -c archive.tar.gz.sha256 и получает archive.tar.gz: OK. На испорченном файле — archive.tar.gz: FAILED и sha256sum: WARNING: 1 computed checksum did NOT match, код возврата 1. Проверено переворотом одного байта внутри второго куска.

6. Ловушка: фиксированная длина суффикса

clai
$ clai разрежь файл на куски по 200 килобайт с двухзначными суффиксами→ split -b 200k -d -a 2 archive.tar.gz fixed-split: output file suffixes exhausted⚠ CAUTION — часть файла не записана, а код возврата всё равно 0

Проверено: -a 2 даёт 100 имён, файлу нужно 123 куска, поэтому split пишет 100 файлов, печатает ошибку и завершается с кодом 0. Без -a он расширяет суффикс сам — имена идут small-00…small-89, затем small-9000, — и порядок склейки остаётся верным, что подтверждают хеши.

Gotchas

  • Одинаковый размер ничего не доказывает. Единственный честный критерий — контрольная сумма исходного файла против суммы склеенного.
  • -a с фиксированной длиной теряет данные молча. Ошибка печатается, но код возврата 0, поэтому скрипт спокойно продолжит работу с неполным набором кусков. Либо не задавайте -a вовсе, либо считайте число кусков заранее.
  • Кусок — не архив. archive.tar.gz.part-00 — это первая треть архива, а не маленький архив. Сначала склейка, потом распаковка: tar на отдельном куске просто пожалуется на неожиданный конец файла.

Related questions

Как резать по строкам, а не по байтам? split -l 100000 big.csv part- режет по границам строк — то, что нужно для текста и логов.

Может ли split сразу сжимать? Нет — сначала tar czf, потом split готового архива. Обратный порядок даёт куски, которые не прочитает ни один инструмент.

А если принимающая сторона на Windows? Там склеивают командой copy /b part-00+part-01+part-02 archive.tar.gz. Важен порядок перечисления.

See also

CliAI пишет и разрезание, и склейку, и проверку суммы по одной фразе и показывает каждую команду до запуска. Поставить одной строкой.