Necesito concatenar fragmentos de dos archivos:
si necesitaba concatenar archivos completos, simplemente podría hacer
cat file1 file2 > output
Pero necesito omitir el primer 1 MB del primer archivo, y solo quiero 10 MB del segundo archivo. Suena como un trabajo para dd.
dd if=file1 bs=1M count=99 skip=1 of=temp1
dd if=file2 bs=1M count=10 of=temp2
cat temp1 temp2 > final_output
¿Existe la posibilidad de hacer esto en un solo paso? es decir, sin la necesidad de guardar los resultados intermedios? ¿Puedo usar múltiples archivos de entrada dd?

oflag=append conv=notruncocurre con ), por lo que es menos probable que los sistemas de archivos que realizan una asignación retrasada (como XFS) decidan que el archivo se termine de escribir cuando aún queda más.ddno se solicitesync, la asignación retrasada no debería activarse inmediatamente de todos modos (a menos que la memoria sea escasa, en cuyo caso ninguno de los métodos pospondrá la asignación).bashymkshque no optimizan la bifurcación para el último comando en una subshell, puede hacerlo un poco más eficiente reemplazando la subshell con un grupo de comandos. Para otros shells, no debería importar, y el enfoque de subshell podría incluso ser un poco más eficiente ya que el shell no necesita guardar y restaurar stdout.No creo que pueda leer fácilmente varios archivos en una sola
ddinvocación, pero puede agregar para construir el archivo de salida en varios pasos:Necesita especificar ambos
conv=notruncyoflag=append. El primero evita truncar la salida, el segundo comienza a escribir desde el final del archivo existente.fuente
Tenga en cuenta que
ddes una interfaz prima hasta elread(),write()ylseek()la llamada al sistema. Solo puede usarlo de manera confiable para extraer fragmentos de datos de archivos normales, bloquear dispositivos y algunos dispositivos de caracteres (como/dev/urandom), es decir, archivos para los queread(buf, size)se garantiza que regresarásizesiempre que no se llegue al final del archivo.Para tuberías, tomas de corriente y la mayoría de los dispositivos de caracteres (como ttys), no tiene esa garantía a menos que lo haga
read()de tamaño 1, o use laddextensión GNUiflag=fullblock.Entonces:
O:
O con proyectiles con soporte incorporado para un operador de búsqueda como
ksh93:O
zsh(suponiendo que suheadsoporte sea la-copción aquí):fuente
$IFS. Eso es independientemente del contenido de la variable / expansión. Consulte también Implicaciones de seguridad de olvidarse de citar una variable en shells bash / POSIXgddlugar dedd. ¿Es un error tipográfico o es intencional?Con un bash ism y funcionalmente "uso inútil de cat ", pero más cercano a la sintaxis que usa el OP:
(Dicho esto, la respuesta de Stephen Kitt parece ser el método más eficiente posible).
fuente
<(...)es un kshismo que tantozshybashcopiado.