
Me gustaría fusionar archivos binarios de manera eficiente usando un comando de shell y rápidamente encontré formas clásicas como esta:
cat file1 file2 > file3
No está mal pero:
- Es lento. El acceso IO es lento.
- Necesita espacio adicional. No quiero copiar los archivos. Simplemente concatenarlos.
Los sistemas de archivos son excelentes para manejar la fragmentación de archivos. ¿No podemos simplemente fusionar archivos usando este mecanismo?
Respuesta1
Puedes hacerlo:
cat file2 file3 [...] filen >> file1
Esto concatenará file2
, file3
,..., filen
hasta el final de file1
in situ. El >>
operador le dice al shell que escriba en elfinal del archivo.
Quiere aprovechar el sistema de archivos para "manejar la fragmentación de archivos". Desafortunadamente, no existe una forma general de hacer esto. Esto se debe a que los "sistemas de archivos" son mucho más generales que los sistemas de archivos en discos; por ejemplo, tieneNFS,FUSIBLEy muchos otros mecanismos que le permiten exponer cualquier tipo de recurso (no solobloquear dispositivoscomo discos duros) como una jerarquía de sistema de archivos. Incluso para los sistemas de archivos basados en dispositivos de bloques, no existe un mecanismo estándar para hacer esto, y tampoco conozco ninguno específico de implementación.
Respuesta2
Coloque sus nombres de archivos en orden en un archivo de texto llamado list.txt
separado por nuevas líneas. Luego ejecuta esto en bash:
while read line; do echo -n . ; dd if="$line" of=out status=none conv=notrunc oflag=append; done < list.txt
Esto creará el archivo concatenado 'out' en el directorio actual.
Respuesta3
dd if=firstfile.raw > completedfile.raw
dd if=nfile.raw >> completedfile.raw
dd if=lastfile.raw >> completedfile.raw