Имейте в виду , что 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), с наименьшей вероятностью решат, что файл готов к записи, когда еще многое предстоит сделать.