split -b 10M -d archive.tar.gz archive.tar.gz.part- corta un archivo en trozos de 10 MB, y cat archive.tar.gz.part-* > restored.tar.gz los vuelve a unir. Que los tamaños coincidan no demuestra nada: la única comprobación honesta es comparar sumas de verificación, y hay un flag que pierde datos sin fallar.
1. Córtalo por tamaño
$ clai parte archive.tar.gz en trozos de 10 megabytes→ 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 es el tamaño del trozo y -d pide sufijos numéricos en lugar de letras. El último trozo es más pequeño, y eso es lo normal. El comando en sí no imprime nada: los tamaños de arriba vienen de ls -l.
2. Vuelve a unirlo
$ clai vuelve a unir el archivo a partir de sus trozos→ cat archive.tar.gz.part-* > restored.tar.gz
No existe un comando "unsplit": todo el truco es cat en el orden del glob. Por eso importan los sufijos — tanto los numéricos como los alfabéticos que genera split se ordenan siempre correctamente.
3. Demuestra que el resultado es idéntico
$ clai comprueba que el archivo reconstruido coincide con el original→ sha256sum archive.tar.gz restored.tar.gz93f9298124fc680c archive.tar.gz93f9298124fc680c restored.tar.gz
Los hashes se han acortado a 16 caracteres para que quepan en una línea. Que los tamaños sean iguales no es prueba: un byte cambiado dentro de un trozo no altera el tamaño.
4. Por número de partes en vez de por tamaño
$ clai parte el archivo en exactamente tres partes→ split -n 3 -d archive.tar.gz piece-8333334 piece-008333333 piece-018333333 piece-02
-n divide en partes iguales y le da el resto a la primera. Útil cuando repartes un archivo entre tres discos, no cuando intentas entrar en un límite de subida.
5. Deja una suma para quien lo reconstruya
$ clai guarda la suma de verificación junto al archivo→ sha256sum archive.tar.gz > archive.tar.gz.sha256
Tras unir los trozos, el otro lado ejecuta sha256sum -c archive.tar.gz.sha256 y obtiene archive.tar.gz: OK. Con un archivo corrupto imprime archive.tar.gz: FAILED y sha256sum: WARNING: 1 computed checksum did NOT match, y sale con código 1 — verificado cambiando un solo byte dentro del segundo trozo.
6. La trampa: longitud de sufijo fija
$ clai parte el archivo en trozos de 200 kilobytes con sufijos de dos dígitos→ split -b 200k -d -a 2 archive.tar.gz fixed-split: output file suffixes exhausted⚠ CAUTION — falta parte del archivo y el código de salida sigue siendo 0
Verificado: -a 2 permite 100 nombres, el archivo necesita 123 trozos, así que split escribe 100 archivos, imprime el error y sale con 0 igualmente. Sin -a, split alarga el sufijo por su cuenta — los nombres van small-00…small-89 y luego small-9000 — y el orden de unión sigue siendo correcto, como confirman los hashes.
Gotchas
- Tamaños iguales no demuestran nada. El único criterio honesto es la suma del original frente a la del archivo reconstruido.
-acon longitud fija pierde datos en silencio. El error se imprime pero el código de salida es 0, así que un script sigue tan tranquilo con un conjunto incompleto de trozos. O no uses-a, o cuenta los trozos de antemano.- Un trozo no es un archivo comprimido.
archive.tar.gz.part-00es el primer tercio de un archivo, no un archivo pequeño. Primero unir, después extraer:tarsobre un trozo suelto se limitará a quejarse de un final inesperado.
Related questions
¿Cómo parto por líneas en vez de por bytes? split -l 100000 big.csv part- corta en límites de línea, que es lo que quieres para texto y logs.
¿Puede split comprimir a la vez? No: primero tar czf y luego parte el archivo resultante. El orden inverso produce trozos que ninguna herramienta puede leer.
¿Y si el otro lado usa Windows? Allí se une con copy /b part-00+part-01+part-02 archive.tar.gz. Lo que importa es el orden de la lista.
See also
- Extraer cualquier archivo comprimido
- Reanudar una descarga interrumpida con curl
- Copiar archivos conservando la estructura de carpetas
CliAI escribe el corte, la unión y la comprobación de suma a partir de una frase, y muestra cada comando antes de ejecutarlo. Instálalo en una línea.