Si tengo un archivo grande y necesito dividirlo en fragmentos de 100 megabytes, lo haré
split -b 100m myImage.iso
Eso generalmente me da algo como
xaa
xab
xac
xad
Y para volverlos a juntar he estado usando
cat x* > myImage.iso
Parece que debería haber una forma más eficiente que leer cada línea de código en un grupo de archivos cat
y redirigir la salida a un nuevo archivo. Como una forma de abrir dos archivos, quitar el EOF
marcador del primero y conectarlos, sin tener que revisar todo el contenido.
Windows / DOS tiene un comando de copia para archivos binarios. La ayuda menciona que este comando fue diseñado para poder combinar múltiples archivos. Funciona con esta sintaxis: ( /b
es para modo binario)
copy /b file1 + file2 + file3 outputfile
¿Hay algo similar o una mejor manera de unir archivos grandes en Linux que cat?
Actualizar
Parece que cat
de hecho es la forma correcta y la mejor manera de unir archivos. Me alegra saber que estaba usando el comando correcto todo el tiempo :) Gracias a todos por sus comentarios.
cat x*
, porque el orden de los archivos depende de la configuración regional. Mejor comience a escribircat x
, que presione Esc y luego*
, verá el orden ampliado de los archivos y podrá reorganizarlos.cat x*
considerar la expansión de la abrazadera de concha,cat xa{a..g}
que expande la secuencia especificada acat
xaa xab xac xad xae xaf xagcat x*
? Sería la nueva configuración regional no que también afectansplit
de manera que sisplit
ycat x*
se utilizaron en el mismo sistema que siempre iba a funcionar?split.c
en Coreutils GNU, los sufijos se construyen a partir de una matriz fija de caracteres:static char const *suffix_alphabet = "abcdefghijklmnopqrstuvwxyz";
. El sufijo no se vería afectado por la configuración regional. (Pero yo no creo que ningún local en su sano juicio reordenar las letras minúsculas, incluso EBCDIC mantiene su orden natural.)Respuestas:
Para eso
cat
está hecho. Dado que es una de las herramientas GNU más antiguas, creo que es muy poco probable que cualquier otra herramienta lo haga más rápido / mejor. Y no es tubería , solo redirige la salida.fuente
cat x, then press Esc
truco que mencionaste es bueno ... He estado buscando algo así, gracias ... buen comentario y buena respuestaCtrl+W
para cortar una palabra y luegoCtrl+Y
pegarla.Bajo el capó
No hay una forma más eficiente que copiar el primer archivo, luego copiar el segundo archivo después, y así sucesivamente. Tanto DOS
copy
comocat
eso.Cada archivo se almacena independientemente de otros archivos en el disco. Casi todos los sistemas de archivos diseñados para almacenar datos en un dispositivo similar a un disco funcionan por bloques. Aquí hay una presentación muy simplificada de lo que sucede: el disco se divide en bloques de, digamos 1kB, y para cada archivo el sistema operativo almacena la lista de bloques que lo componen. La mayoría de los archivos no tienen un número entero de bloques largos, por lo que el último bloque solo está parcialmente ocupado. En la práctica, los sistemas de archivos tienen muchas optimizaciones, como compartir el último bloque parcial entre varios archivos o almacenar "bloques 46798 a 47913" en lugar de "bloque 46798, bloque 46799, ...". Cuando el sistema operativo necesita crear un nuevo archivo, busca bloques libres. Los bloques no tienen que ser consecutivos: si solo los bloques 4, 5, 98 y 178 son gratuitos, aún puede almacenar un archivo de 4kB.
Podría admitir bloques parciales en el medio del archivo, pero eso agregaría una complejidad considerable, particularmente al acceder a archivos de forma no secuencial: para saltar al byte 10340, ya no podría saltar al byte 100 del bloque 11, tendría que para verificar la longitud de cada bloque intermedio.
Dado el uso de bloques, no puede simplemente unir dos archivos, porque en general el primer archivo termina a mitad de bloque. Claro, podría tener un caso especial, pero solo si desea eliminar ambos archivos al concatenar. Eso sería un manejo altamente específico para una operación rara. Tal manejo especial no vive solo, porque en un sistema de archivos típico, se accede a muchos archivos al mismo tiempo. Entonces, si desea agregar una optimización, debe pensar cuidadosamente: ¿qué sucede si algún otro proceso está leyendo uno de los archivos involucrados? ¿Qué sucede si alguien intenta concatenar A y B mientras alguien concatena A y C? Y así. En general, esta rara optimización sería una carga enorme.
Con todo, no puede hacer que la unión de archivos sea más eficiente sin hacer grandes sacrificios en otro lugar. Que no vale la pena.
Sobre dividir y unir
split
ycat
son formas simples de dividir y unir archivos.split
se encarga de producir archivos nombrados en orden alfabético, por lo quecat *
funciona para unirse.Una desventaja de
cat
unirse es que no es robusto frente a los modos de falla comunes. Si uno de los archivos está truncado o falta,cat
no se quejará, solo obtendrá un resultado dañado.Hay utilidades de compresión que producen archivos de varias partes, como
zipsplit
yrar -v
. No son muy unixy, porque comprimen y empaquetan (ensamblan varios archivos en uno) además de dividir (y viceversa descomprimir y descomprimir además de unir). Pero son útiles porque verifican que tiene todas las partes y que las partes están completas.fuente
Excepto que eso no es realmente lo que está sucediendo. El shell está conectando la salida estándar
cat
directamente al archivo abierto, lo que significa que "pasar por salida estándar" es lo mismo que escribir en el disco.fuente
cat
. Gracias por informarme sobre la conexión directa.Una vez tuve exactamente este problema: quería unir algunos archivos, pero no tenía suficiente espacio en disco para mantenerlos doblemente.
Entonces escribí un montón de programas:
Esto me permitió hacer algo como
y así eliminar el archivo fuente mientras 128M todavía no estaba escrito. Un poco peligroso, pero si los datos no son tan valiosos, o existen en otro lugar, es factible.
Si es necesario, puedo proporcionar la fuente.
fuente
Técnicamente hablando, esta es una forma de acceder al archivo completo sin tener que leer y escribir todo el contenido, y podría ser útil para archivos grandes o si queda poco espacio:
Y luego usar
myImage.iso
, por ejemploAunque, por supuesto,
myImage.iso
es un archivo especial (llamado canalización) y no un archivo normal, por lo que puede ser útil o no, dependiendo de lo que intente hacer.fuente
División de archivos
Dividir por tamaño
Si desea dividir archivos grandes en archivos pequeños y elegir el nombre y el tamaño de los archivos de salida pequeños, esta es la manera.
De esta manera, elige dividir un archivo grande en partes más pequeñas de 500 MB. También desea que los nombres de los archivos de piezas sean SmallFile. Tenga en cuenta que necesita un punto después del nombre del archivo. El resultado debería ser la generación de nuevos archivos como este:
Dividir por número de líneas
De esta manera, dividirá el archivo de texto en archivos más pequeños limitados a 50 líneas.
El resultado debería ser algo como esto:
Dividir por bytes
Dividir en archivos pequeños con tamaño personalizado de archivos pequeños en bytes:
El resultado debe ser similar al resultado de la división por número de líneas .
Unir archivos
Puede unir archivos de dos maneras. El primero es:
o con:
Nota: Cuando unes archivos, los archivos pequeños no deben dañarse. Además, todos los archivos pequeños (partes) deben estar en el mismo directorio.
fuente