Akılda Ayı dd
ham arayüzüdür read()
, write()
ve lseek()
sistem çağrısı. Yalnızca normal dosyalardan veri parçalarını ayıklamak, aygıtları ve bazı karakter aygıtlarını (gibi /dev/urandom
) ayıklamak için güvenilir bir şekilde kullanabilirsiniz ; bu, dosyanın sonuna ulaşılmadığı sürece dosyalarının read(buf, size)
döndürüleceği garantilidir size
.
Borular, soketler ve çoğu karakter cihazı (ttys gibi) için, read()
1 boyutunda olmadıkça veya GNU dd
uzantısını kullanmadığınız sürece böyle bir garantiniz yoktur iflag=fullblock
.
Bu yüzden ya:
{
gdd < file1 bs=1M iflag=fullblock count=99 skip=1
gdd < file2 bs=1M iflag=fullblock count=10
} > final_output
Veya:
M=1048576
{
dd < file1 bs=1 count="$((99*M))" skip="$M"
dd < file2 bs=1 count="$((10*M))"
} > final_output
Veya aşağıdaki gibi bir arama operatörü için yerleşik desteğe sahip kabuklarla ksh93
:
M=1048576
{
command /opt/ast/bin/head -c "$((99*M))" < file1 <#((M))
command /opt/ast/bin/head -c "$((10*M))" < file2
}
Veya zsh
( head
buradaki -c
seçeneği desteklediğini varsayarak ):
zmodload zsh/system &&
{
sysseek 1048576 && head -c 99M &&
head -c 10M < file2
} < file1 > final_output
oflag=append conv=notrunc
), bu nedenle gecikmeli ayırma (XFS gibi) yapan dosya sistemlerinin, daha fazla şey olduğunda dosyanın yazılmasına karar vermesi en az muhtemeldir.