David Haller <[EMAIL PROTECTED]> writes:

>>  dd if=$1 of=- bs=584 seek=$SEEK count=1 |\
>
> Da fehlt die Umrechung in die Bloecke (s.u.)... Du rufst so dd fuer
> jedes byte auf...

Was meinst Du mit "Umrechung in die BlÃcke"?

Dieser Befehl fÃhrt eine einzige Leseoperation aus, in der er 584 Bytes
liest. Fehlerhaft ist allerdings, daà "seek" nicht im Input, sondern im
Output BlÃcke Ãberspringt. Gemeint war wohl "skip".

> BLKSZ=584
> [...]
>     dd if="$1" bs="$BLKSZ" seek="$seek" count=1 | \

Abgesehen vom fehlenden "of=-", Unterschieden im Quoting und unter-
schiedlichen Variablennamen unterscheidet sich das nicht von der Zeile,
die Du kritisiert hattest.

> Diese Loesung hat allerdings den Nachteil, dass bei grossen Dateien
> die Ausfuehrungszeit exponentiell steigt, weil fuer jedes Fragment a
> $BLKSZ Bytes die Datei neu geoeffnet werden muss, an die richtige
> Stelle ge"seek"t werden muss, und dann jeweils nur ein Block von
> $BLKSZ Bytes gelesen und ausgegeben wird... Bei kleinen Dateien (sagen
> wir, bis 100 * $BLKSZ) geht das noch, aber darueber wird's schnell
> eklig.

Die Zeit, um an eine bestimmte Stelle in einer Datei zu "seeken", ist
ungefÃhr konstant, unabhÃngig davon, wo in der Datei die Stelle liegt.
Darum ist die AusfÃhrungszeit des Skriptes _linear_ von der DateigrÃÃe
abhÃngig.

Davon, daà dd tatsÃchlich den Systemcall "lseek" verwendet, kann man
sich im Quellcode (coreutils 5.2.1) in Datei src/dd.c, Zeile 818
Ãberzeugen.

Martin

Antwort per Email an