split -b 10M -d archive.tar.gz archive.tar.gz.part- режет файл на куски по 10 МБ, а cat archive.tar.gz.part-* > restored.tar.gz собирает их обратно. Совпадение размеров ничего не доказывает — честная проверка только по контрольным суммам, и есть флаг, который теряет данные, не сообщая об ошибке.
1. Разрезать по размеру
$ 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 собери файл обратно из кусков→ cat archive.tar.gz.part-* > restored.tar.gz
Отдельной команды «склеить» не существует: весь фокус в cat по порядку глоба. Именно поэтому важны суффиксы — и числовые, и буквенные, которые генерирует split, всегда сортируются правильно.
3. Доказать, что вышло то же самое
$ clai проверь, что собранный файл совпадает с исходным→ sha256sum archive.tar.gz restored.tar.gz93f9298124fc680c archive.tar.gz93f9298124fc680c restored.tar.gz
Хеши здесь укорочены до 16 символов, чтобы влезли в строку. Одинаковый размер файлов — не доказательство: перевёрнутый байт внутри куска размер не меняет вовсе.
4. Не по размеру, а на число частей
$ clai разрежь файл ровно на три части→ split -n 3 -d archive.tar.gz piece-8333334 piece-008333333 piece-018333333 piece-02
-n делит на равные части, а остаток отдаёт первой. Удобно, когда файл раскидывают по трём носителям, а не подгоняют под лимит загрузки.
5. Оставить контрольную сумму тому, кто будет склеивать
$ 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 разрежь файл на куски по 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
- Распаковать любой архив
- Докачать прерванную загрузку через curl
- Скопировать файлы, сохранив структуру папок
CliAI пишет и разрезание, и склейку, и проверку суммы по одной фразе и показывает каждую команду до запуска. Поставить одной строкой.