Schreibe n Bytes aus einer Datei in eine andere in Bash

2157
PiNewbie

Hallo, wie kann ich nBytes aus einer Datei in eine neue Datei schreiben, die von der kPosition aus mit Bash beginnt ?

  • Wenn zum Beispiel n = 60, k = 1 und Dateigröße = 100, dann gilt: Die 2. Datei würde aus dem 1. Byte bis zum 60. Byte bestehen und wäre 60 Byte groß
  • Wenn zum Beispiel n = 40, k = 61 und Dateigröße = 100, dann gilt: Die 2. Datei würde aus dem 61. Byte bis zum 100. Byte bestehen und wäre 40 Byte groß

Möglicherweise arbeiten wir mit Binärdateien und nicht mit ASCII-Dateien, daher sollte die Verkettung von 2 Hälften mit der Originaldatei identisch sein!

(Ist es möglich mit dd?)

7
Siehe "dd" und seine Optionen "überspringen", "zählen" und "ibs". choroba vor 7 Jahren 2

2 Antworten auf die Frage

11
cxw

Ja. Auf der Manpage von dd suchen Sie nach etwas wie:

dd bs=1 count=60 if=_filename_1_ of=_filename_2_ dd bs=1 skip=60 count=40 if=_filename_1_ of=_filename_2_ 

wo _filename_n_wird durch einen tatsächlichen Dateinamen ersetzt.

bs=1bedeutet, dass countund skipByte zählen. skipist wie viele zu überspringen; countist, wie viele kopiert werden sollen. Die Anzahl der Bytes für das Editieren beginnt bei 0 und nicht bei 1. Verwenden Sie daher das erste Byte skip=0(oder lassen Sie es skipnicht angegeben).

Als Bash-Funktion können Sie Folgendes verwenden:

# copy_nk(n, k, infile, outfile) copy_nk() { dd bs=1 count="$1" skip="$2" $ $ } 

und dann nennen Sie es als

copy_nk 60 0 infile.txt outfile.txt 

(mit k = 0weil Byte-Nummern bei Null beginnen).

Mit $können Sie die Ausgabedatei oder die Eingabedatei weglassen. Z.B,

cat infile.txt | copy_nk 60 0 > outfile.txt 
Beginnt der Indexzähler bei 0 oder 1. Wenn also überspringen '1' ist, heißt das, dass er beim 2. Byte beginnt. Ist das korrekt? PiNewbie vor 7 Jahren 0
5
Digital Trauma

Hier ist ein weiterer Ansatz, der die headBefehlsgruppen bash verwendet:

{ head -c60 > /dev/null ; head -c40 > output.txt ; } < input.txt 

Der erste headliest die ersten 60 Bytes aus input.txt und sendet sie an den Bit-Bucket.

Da sich diese headBefehle in der Befehlsgruppe befinden, bleibt die Dateiposition in input.txt erhalten. Der zweite headliest also die nächsten 40 Bytes (von Byte 61 bis 100 unter Verwendung der 1-basierten Indexierung) und schreibt sie in output.txt.


Tatsächlich kann diese Methode verallgemeinert werden, um splitFunktionalität zu geben, die jedoch die Länge jeder Ausgabedatei angeben kann. Nehmen wir an, wir haben eine 100-Byte-Datei, die wir in Blöcke der Größen 7, 50, 23 und den Rest aufteilen möchten. Wir könnten:

{ head -c7 > 7bytes.txt head -c50 > 50bytes.txt head -c23 > 23bytes.txt cat > remaining-bytes.txt } < input.txt 
Sie können ein Dateisystem mit "head" genauso leicht (oder einfacher) beschädigen, wenn Sie verrückt genug sind, um seine Ausgabe an ein Blockgerät weiterzuleiten. Natürlich würden Sie das nicht tun - Sie würden stattdessen `dd 'oder etwas anderes für den Job verwenden. Der Grund für den unheimlichen Ruf von `dd` ist, dass es nur robust genug ist, dass Sie es mehr oder weniger sicher für an sich gefährliche Aufgaben wie das Klonen von Disk-Images verwenden können, wenn Sie vorsichtig genug sind. Natürlich sind und sind einige Leute nicht in der Lage, ihre Festplatte durcheinander zu bringen, aber der Grund dafür ist nicht, dass sie `dd` verwendet haben, sondern dass sie sich mit` / dev / sda` befasst haben. Ilmari Karonen vor 7 Jahren 3
Sehr schön! Ich wusste nicht über "head -c". cxw vor 7 Jahren 0
Sie können ein Dateisystem nur dann beschädigen, wenn Sie als Root ausgeführt werden. Wenn Sie root sind, können Sie es mit praktisch jedem Dienstprogramm beschädigen, das in Dateien schreibt. Barmar vor 7 Jahren 1
@IlmariKaronen Fair genug - Ich habe die unnötige Anti-`dd`-FUD entfernt. Digital Trauma vor 7 Jahren 0