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=notrunc
ocurre 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.dd
no 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).bash
ymksh
que 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
dd
invocación, pero puede agregar para construir el archivo de salida en varios pasos:Necesita especificar ambos
conv=notrunc
yoflag=append
. El primero evita truncar la salida, el segundo comienza a escribir desde el final del archivo existente.fuente
Tenga en cuenta que
dd
es 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ásize
siempre 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 ladd
extensión GNUiflag=fullblock
.Entonces:
O:
O con proyectiles con soporte incorporado para un operador de búsqueda como
ksh93
:O
zsh
(suponiendo que suhead
soporte sea la-c
opció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 / POSIXgdd
lugar 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 tantozsh
ybash
copiado.