Майте на увазі , що dd
є низькорівневим інтерфейсом до read()
, write()
і lseek()
системний виклик. Ви можете його надійно використовувати лише для вилучення фрагментів даних із звичайних файлів, блокування пристроїв та деяких символьних пристроїв (наприклад /dev/urandom
), тобто файлів, які read(buf, size)
гарантовано повертаються до size
тих пір, поки не буде досягнуто кінця файлу.
Для труб, розеток і більшості символьних пристроїв (як-от ttys) у вас немає такої гарантії, якщо ви не маєте read()
розмір 1 або не використовуєте dd
розширення GNU iflag=fullblock
.
Так чи:
{
gdd < file1 bs=1M iflag=fullblock count=99 skip=1
gdd < file2 bs=1M iflag=fullblock count=10
} > final_output
Або:
M=1048576
{
dd < file1 bs=1 count="$((99*M))" skip="$M"
dd < file2 bs=1 count="$((10*M))"
} > final_output
Або з оболонками з вбудованою підтримкою для оператора пошуку, наприклад ksh93
:
M=1048576
{
command /opt/ast/bin/head -c "$((99*M))" < file1 <#((M))
command /opt/ast/bin/head -c "$((10*M))" < file2
}
Або zsh
(якщо ви head
підтримуєте -c
опцію тут):
zmodload zsh/system &&
{
sysseek 1048576 && head -c 99M &&
head -c 10M < file2
} < file1 > final_output
oflag=append conv=notrunc
), тому файлові системи, які затримують розподіл (наприклад, XFS), найменш імовірно, вирішать, що файл буде записаний тоді, коли ще потрібно ще щось.