Wie mache ich das so dd if=somefile bs=1 skip=1337 count=31337000
, aber effizient, ohne 1-Byte-Lese- und Schreibzugriff?
Die Lösung wird erwartet:
- Um einfach zu sein (für Nicht-Einfache kann ich einige Perl-Oneliner schreiben, die dies tun)
- Um große Offsets und Längen zu unterstützen (so dass Hacks mit Blockgröße in dd nicht helfen)
Teillösung (nicht einfach genug, wenn Sie das Gleiche mit der Länge versuchen, wird es noch komplexer):
dd if=somefile bs=1000 skip=1 count=31337 | { dd bs=337 count=1 of=/dev/null; rest_of_pipeline; }
# 1337 div 1000 and 1337 mod 1000
Antworten:
Dies sollte es tun (auf gnu dd):
Wenn Sie
seek=
auch verwenden, können Sie auch in Betracht ziehenoflag=seek_bytes
.Von
info dd
:Ps: Ich verstehe, dass diese Frage alt ist und es scheint, dass diese Flags implementiert wurden, nachdem die Frage ursprünglich gestellt wurde, aber da es eines der ersten Google-Ergebnisse für eine verwandte DD-Suche ist, die ich durchgeführt habe, wäre es schön, sie mit der neuen zu aktualisieren Feature.
quelle
Verwenden Sie einen Prozess, um alle anfänglichen Bytes zu löschen, und einen zweiten, um die tatsächlichen Bytes zu lesen, z.
Der zweite
dd
kann die Eingabe mit jeder Blockgröße lesen, die Sie für effizient halten. Beachten Sie, dass hierfür ein zusätzlicher Prozess erstellt werden muss. Abhängig von Ihrem Betriebssystem ist dies mit Kosten verbunden, aber wahrscheinlich ist es kleiner, als die Dateien einzeln zu lesen (es sei denn, Sie haben eine sehr kleine Datei, in diesem Fall liegt kein Problem vor).quelle
dd if=/dev/sda bs=10000000001 | dd bs=255 count=1 | hd
-> "dd: ungültige Nummer" 10000000001 "dd if=/dev/sda bs=16M skip=596 count=1 | dd bs=512 skip=1522 count=1 | (dd bs=1 count=1 of=/dev/null ; dd bs=255 count=1)
read -n
zu überspringen? Und dannhead -c
zu zählen? ZBcat somefile | (read -n 1337; head -c 31337000)
Oder Sie könnten es tun, ohne einen zusätzlichen Prozessexec 3<somefile; read -n 1337 -u 3; head -c 31337000 <&3
Statt
bs=1
Verwendungbs=4096
oder mehr.quelle
f.seek(1337)
vor der Verwendungread(MY_CHUNK_SIZE)
Sie können den Befehl hexdump ausführen:
Wenn Sie nur den Inhalt sehen wollen:
quelle