Denken Sie daran , dass dd
eine rohe Schnittstelle zu der ist read()
, write()
und lseek()
Systemaufruf. Sie können es nur zuverlässig verwenden, um Datenblöcke aus regulären Dateien, Blockgeräten und einigen Zeichengeräten (z. B. /dev/urandom
) zu extrahieren. Dies sind Dateien, für die read(buf, size)
eine Rückgabe garantiert ist, size
solange das Ende der Datei nicht erreicht wird.
Für Pipes, Sockets und die meisten Zeichengeräte (wie ttys) gibt es keine solche Garantie, es sei denn, Sie haben die read()
Größe 1 oder verwenden die GNU- dd
Erweiterung iflag=fullblock
.
Also entweder:
{
gdd < file1 bs=1M iflag=fullblock count=99 skip=1
gdd < file2 bs=1M iflag=fullblock count=10
} > final_output
Oder:
M=1048576
{
dd < file1 bs=1 count="$((99*M))" skip="$M"
dd < file2 bs=1 count="$((10*M))"
} > final_output
Oder mit Shells mit eingebauter Unterstützung für einen Suchoperator wie ksh93
:
M=1048576
{
command /opt/ast/bin/head -c "$((99*M))" < file1 <#((M))
command /opt/ast/bin/head -c "$((10*M))" < file2
}
Oder zsh
(vorausgesetzt, Sie head
unterstützen die -c
Option hier):
zmodload zsh/system &&
{
sysseek 1048576 && head -c 99M &&
head -c 10M < file2
} < file1 > final_output
oflag=append conv=notrunc
), sodass Dateisysteme mit verzögerter Zuweisung (wie XFS) mit der geringsten Wahrscheinlichkeit entscheiden, dass das Schreiben der Datei abgeschlossen ist, wenn noch mehr zu tun ist.