Ich habe kürzlich festgestellt, dass wir cat
verwenden können so viel wie dd
, und es ist tatsächlich schneller als dd
Ich kenne das dd
war nützlich im Umgang mit Bändern, bei denen die Blockgröße tatsächlich für die Korrektheit von Bedeutung war, nicht nur für die Leistung. Heutzutage gibt es jedoch Situationen, in denen dd
etwas tun kann cat
kippen? (Hier würde ich einen Leistungsunterschied von weniger als 20 % als irrelevant ansehen.)
Konkrete Beispiele wären schön!
Akzeptierte Antwort:
Im Aussehen dd
ist ein Tool eines IBM-Betriebssystems, das sein fremdes Erscheinungsbild (seine Parameterübergabe) beibehalten hat und einige sehr selten verwendete Funktionen ausführt (wie EBCDIC-zu-ASCII-Konvertierungen oder Endianness-Umkehrung ... heutzutage nicht mehr üblich).
Früher dachte ich, dass dd
war schneller beim Kopieren großer Datenblöcke auf dieselbe Festplatte (aufgrund der effizienteren Nutzung der Pufferung), aber das stimmt nicht, zumindest nicht auf den heutigen Linux-Systemen.
Ich denke einige von dd
Die Optionen sind nützlich, wenn es um Bänder geht, wo das Lesen wirklich in Blöcken erfolgt (Bandtreiber verstecken die Blöcke auf dem Speichermedium nicht wie Plattentreiber). Aber ich kenne die Einzelheiten nicht.
Eine Sache dd
kann, was von keinem anderen POSIX-Tool (leicht) getan werden kann, nimmt die ersten N Bytes eines Baches. Viele Systeme können dies mit head -c 42
tun , aber head -c
, ist zwar üblich, aber nicht in POSIX enthalten (und ist heute z. B. nicht auf OpenBSD verfügbar). (tail -c
ist POSIX.) Auch wo head -c
vorhanden ist, liest es möglicherweise zu viele Bytes aus der Quelle (weil es intern stdio-Pufferung verwendet), was ein Problem darstellt, wenn Sie aus einer speziellen Datei lesen, bei der nur das Lesen eine Auswirkung hat. (Aktuelle GNU Coreutils lesen die genaue Anzahl mit head -c
, aber FreeBSD und NetBSD verwenden stdio.)
Allgemeiner, dd
bietet eine Schnittstelle zur zugrunde liegenden Datei-API, die unter Unix-Tools einzigartig ist:nur dd
kann überschreiben oder abschneiden eine Datei jederzeit oder suchen in einer Datei. (Dies ist dd
‘s einzigartige Fähigkeit, und es ist eine große; seltsamerweise dd
ist am besten für Dinge bekannt, die andere Tools können.)
- Die meisten Unix-Tools überschreiben ihre Ausgabedatei, d.h. löschen ihren Inhalt und starten sie von vorne. Das passiert, wenn Sie
>
verwenden Umleitung auch in der Shell. - Sie können mit
>>
an den Inhalt einer Datei anhängen Umleitung in der Shell oder mittee -a
. -
Wenn Sie eine Datei kürzen möchten, indem Sie alle Daten nach einer bestimmten Stelle entfernen , wird dies vom zugrunde liegenden Kernel und der C-API durch
truncate
unterstützt Funktion, aber von keinem Befehlszeilentool außerdd
verfügbar gemacht :dd if=/dev/null of=/file/to/truncate seek=1 bs=123456 # truncate file to 123456 bytes
-
Wenn Sie Daten in der Mitte einer Datei überschreiben möchten, ist dies wiederum in der zugrunde liegenden API möglich, indem Sie die Datei zum Schreiben ohne Abschneiden öffnen (und
lseek
aufrufen um ggf. an die gewünschte Position zu springen), sondern nurdd
kann eine Datei ohne Abschneiden oder Anhängen öffnen oder von der Shell aus suchen (komplexeres Beispiel).# zero out the second kB block in the file (i.e. bytes 1024 to 2047) dd if=/dev/zero of=/path/to/file bs=1024 seek=1 count=1 conv=notrunc
Also… Als Systemtool dd
ist ziemlich nutzlos. Als Text- (oder Binärdatei-) Verarbeitungstool ist es sehr wertvoll!