Tenga en cuenta que dd
es una interfaz prima hasta el read()
, write()
y lseek()
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 que read(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 la dd
extensión GNU iflag=fullblock
.
Entonces:
{
gdd < file1 bs=1M iflag=fullblock count=99 skip=1
gdd < file2 bs=1M iflag=fullblock count=10
} > final_output
O:
M=1048576
{
dd < file1 bs=1 count="$((99*M))" skip="$M"
dd < file2 bs=1 count="$((10*M))"
} > final_output
O con proyectiles con soporte incorporado para un operador de búsqueda como ksh93
:
M=1048576
{
command /opt/ast/bin/head -c "$((99*M))" < file1 <#((M))
command /opt/ast/bin/head -c "$((10*M))" < file2
}
O zsh
(suponiendo que su head
soporte sea la -c
opción aquí):
zmodload zsh/system &&
{
sysseek 1048576 && head -c 99M &&
head -c 10M < file2
} < file1 > final_output
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.