Ghi nhớ rằng dd
là một giao diện thô đến read()
, write()
và lseek()
cuộc gọi hệ thống. Bạn chỉ có thể sử dụng nó một cách đáng tin cậy để trích xuất các khối dữ liệu khỏi các tệp thông thường, các thiết bị chặn và một số thiết bị ký tự (như /dev/urandom
), đó là các tệp read(buf, size)
được đảm bảo trả về size
miễn là không đạt đến cuối tệp.
Đối với đường ống, ổ cắm và hầu hết các thiết bị ký tự (như ttys), bạn không có sự đảm bảo nào trừ khi bạn có read()
kích thước 1 hoặc sử dụng dd
phần mở rộng GNU iflag=fullblock
.
Vì vậy:
{
gdd < file1 bs=1M iflag=fullblock count=99 skip=1
gdd < file2 bs=1M iflag=fullblock count=10
} > final_output
Hoặc là:
M=1048576
{
dd < file1 bs=1 count="$((99*M))" skip="$M"
dd < file2 bs=1 count="$((10*M))"
} > final_output
Hoặc với hệ vỏ có hỗ trợ dựng sẵn cho toán tử tìm kiếm như ksh93
:
M=1048576
{
command /opt/ast/bin/head -c "$((99*M))" < file1 <#((M))
command /opt/ast/bin/head -c "$((10*M))" < file2
}
Hoặc zsh
(giả sử bạn head
hỗ trợ -c
tùy chọn ở đây):
zmodload zsh/system &&
{
sysseek 1048576 && head -c 99M &&
head -c 10M < file2
} < file1 > final_output
oflag=append conv=notrunc
), vì vậy các hệ thống tệp bị phân bổ chậm (như XFS) ít có khả năng quyết định tệp được thực hiện khi còn nhiều việc phải làm.