こんにちは、Bashを使用して、n
の位置から開始して、k
バイトを新しいファイルに書き込む方法を教えてください。
おそらく、ASCIIファイルではなく、バイナリファイルで作業しているため、2つの半分の連結は元のファイルと同じになるはずです!
(dd
で可能ですか?)
はい。 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
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