web-dev-qa-db-ja.com

Bashでファイルからnバイトを別のファイルに書き込む

こんにちは、Bashを使用して、nの位置から開始して、kバイトを新しいファイルに書き込む方法を教えてください。

  • たとえば、n = 60、k = 1、ファイルサイズ= 100の場合、2番目のファイルは1バイト目から60バイト目までで構成され、サイズは60バイトになります。
  • たとえば、n = 40、k = 61、ファイルサイズ= 100の場合、2番目のファイルは61バイト目から100バイト目までで構成され、サイズは40バイトになります。

おそらく、ASCIIファイルではなく、バイナリファイルで作業しているため、2つの半分の連結は元のファイルと同じになるはずです!

ddで可能ですか?)

10
PiNewbie

はい。 dd man page に従って、次のようなものを探しています:

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

ここで、_filename_n_は実際のファイル名に置き換えられます。

bs=1は、countおよびskipがバイト数であることを意味します。 skipはスキップする数です。 countはコピーする数です。 Editバイトカウントは1ではなく0から始まります。したがって、最初のバイトから開始するには、skip=0を使用します(またはskip未指定)。

Bash関数として、次のものを使用できます。

# copy_nk(n, k, infile, outfile)
copy_nk() {
    dd bs=1 count="$1" skip="$2" ${3:+if="$3"} ${4:+of="$4"}
}

そしてそれを

copy_nk 60 0 infile.txt outfile.txt

(バイト数はゼロから始まるため、k = 0を使用)。

${3:+...}を使用すると、出力ファイルまたは入力ファイルを省略できます。例えば。、

cat infile.txt | copy_nk 60 0 > outfile.txt
12
cxw

headおよびbashコマンドグループを使用した別のアプローチを次に示します。

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

最初のheadは、ここでinput.txtから最初の60バイトを読み取り、それをビットバケットに送信します。

これらのheadコマンドはコマンドグループ内にあるため、input.txt内のファイル位置は保持されます。したがって、2番目のheadは、次の40バイト(1から始まるインデックスを使用してバイト61から100まで)を読み取り、output.txtに書き込みます。


実際、このメソッドはsplitのような機能を提供するように一般化できますが、各出力ファイルの長さを指定できるという追加の利点があります。 100バイトのファイルがあり、サイズ7、50、23、その他のチャンクに分割したいとします。できること:

{
    head -c7 > 7bytes.txt
    head -c50 > 50bytes.txt
    head -c23 > 23bytes.txt
    cat > remaining-bytes.txt
} < input.txt
6
Digital Trauma