dd
コマンドでは、skip
ファイル内のnバイトスキップを使用できます。 n番目のバイトからファイルの終わりまでコピーされます。しかし、1228から1331にバイナリデータをコピーしたいです。dd
Linuxでこれを達成するには?
答え1
count
コピーするバイト数を指定するために使用されます。計算を実行するには、シェルを使用します。ibs=1
入力ブロックサイズを1に設定するために使用されるため、およびskip
すべてcount
バイト単位で指定されます。
dd ibs=1 skip=1228 count=$((1331-1228+1))
1228 と 1331-1228+1 は両方とも 4 の倍数なので、入力ブロックサイズを 4 に設定するとより効率的になりますが、何度も使用しない場合は最適化が失われます。騒音。結果を事前に計算するなどの他の操作を1331-1228+1
最初に実行する必要があります。
dd ibs=4 skip=$((1228/4)) count=$(((1331-1228+1)/4))
答え2
dd
単に使用する理由はありません。。単純なhead
合計tail
の組み合わせで十分です(GNUツールが必要です)。
head -c 1331 file | tail -c $((1331-1228+1))
答え3
私は共通スクリプトdd-file-range.shを完了しました。 dd-filescope.sh
あるファイルから別のファイルにバイト範囲をコピーするために使用されます。
Linux カーネル-5.3 または FreeBSD-13 の copy_file_range(2) システムコールと同様に、
以下も参照してください。Linux copye_file_range()そしてFreeBSDコピー_ファイル_範囲()
また、最新のLinuxディストリビューションでは、dd-file-range.shの代わりにxfs_io->copy_rangeサブコマンドを使用することもできます。
使用法:
$ dd-file-range.sh
Usage: dd-file-range.sh <ifile[:skip_offset[:len]]> [ofile[:seek_offset]] [-bs=BSIZE] [-sep=<seperator>] [-log=<0|1|2>]
#Comment: if 'skip_offset' start with '['; trate it as 'start' #((start=skip_offset+1))
#Comment: if 'len' has a suffix ']'; trate it as 'end' #((end=skip_offset+len))
#Comment: e.g: ifile:5:5 <=is equivalent to=> ifile:[6:10]
Examples:
dd-file-range.sh ifile:8192:512 ofile
dd-file-range.sh ifile::4096 ofile:1024
dd-file-range.sh ifile:4 #output to stdout
dd-file-range.sh <(cat):4 ofile #read from stdin
dd-file-range.sh ifile::4 ifile:10 #copy data within same file
元の質問の場合は、dd-file-range.shを使用できます。たとえば、次のようになります。
$ dd-file-range.sh kiss-vm:$((1228-1)):$((1331-1228+1))
$ #or simple
$ dd-file-range.sh kiss-vm:[1228:1331]
さまざまなBSのパフォーマンステスト:
$ ls -lh kiss-vm.gif
-rw-r--r-- 1 yjh fs-qe 4.0M May 12 2021 kiss-vm.gif
$ time dd-file-range.sh kiss-vm.gif:1981 b:1981 -ver=old -bs=$((128*1024))
real 0m0.023s
user 0m0.005s
sys 0m0.026s
$ time dd-file-range.sh kiss-vm.gif:1981 b:1981 -ver=old -bs=$((64*1024))
real 0m0.023s
user 0m0.007s
sys 0m0.022s
$ time dd-file-range.sh kiss-vm.gif:1981 b:1981 -ver=old #default BS == $((16*1024))
real 0m0.022s
user 0m0.003s
sys 0m0.025s
$ time dd-file-range.sh kiss-vm.gif:1981 b:1981 -ver=old -bs=$((8*1024))
real 0m0.022s
user 0m0.005s
sys 0m0.023s
$ time dd-file-range.sh kiss-vm.gif:1981 b:1981 -ver=old -bs=$((4*1024))
real 0m0.023s
user 0m0.008s
sys 0m0.022s
$ time dd-file-range.sh kiss-vm.gif:1981 b:1981 -ver=old -bs=1024
real 0m0.024s
user 0m0.005s
sys 0m0.028s
$ time dd-file-range.sh kiss-vm.gif:1981 b:1981 -ver=old -bs=512
real 0m0.039s
user 0m0.006s
sys 0m0.048s
$ time dd-file-range.sh kiss-vm.gif:1981 b:1981 -ver=old -bs=256
real 0m0.037s
user 0m0.010s
sys 0m0.044s
$ time dd-file-range.sh kiss-vm.gif:1981 b:1981 -ver=old -bs=128
real 0m0.046s
user 0m0.012s
sys 0m0.057s
$ time dd-file-range.sh kiss-vm.gif:1981 b:1981 -ver=old -bs=64
real 0m0.072s
user 0m0.011s
sys 0m0.102s
$ time dd-file-range.sh kiss-vm.gif:1981 b:1981 -ver=old -bs=32
real 0m0.129s
user 0m0.014s
sys 0m0.199s
$ time dd-file-range.sh kiss-vm.gif:1981 b:1981 -ver=old -bs=16
real 0m0.275s
user 0m0.049s
sys 0m0.425s
$ time dd-file-range.sh kiss-vm.gif:1981 b:1981 -ver=old -bs=8
real 0m0.460s
user 0m0.077s
sys 0m0.707s
$ time dd-file-range.sh kiss-vm.gif:1981 b:1981 -ver=old -bs=4
real 0m1.278s
user 0m0.208s
sys 0m2.082s
$ time dd-file-range.sh kiss-vm.gif:1981 b:1981 -ver=old -bs=2
real 0m1.841s
user 0m0.294s
sys 0m2.846s
$ time dd-file-range.sh kiss-vm.gif:1981 b:1981 -ver=old -bs=1
real 0m3.924s
user 0m0.610s
sys 0m6.227s