今回はLinuxのddコマンドです。
10 Byteの全データ0のバイナリデータを作ってみます。
takk@deb9:~/tmp$ dd if=/dev/zero of=test.bin bs=1 count=10 10+0 レコード入力 10+0 レコード出力 10 bytes copied, 0.000134315 s, 74.5 kB/s takk@deb9:~/tmp$
作れましたが、使い方、やたらと難しいです。
Linux入門dd等のキーワードで探せば、ddコマンドの使い方は、上のような形式的に出てくると思います。
まあ間違ってはいないのでしょうけど、小難しいんですよね。
Unix/Linuxのコマンドはフィルタとして設計されてるので、パイプで渡す例を覚えれば簡単です。
データの流れはこんな感じ。
/dev/zero ===> dd ===> 出力ファイル
/dev/zeroは、0値が流れ出る水道のようなもので、ファイルにリダイレクトすると大変なことになります。
ddを挟まないとこのようなフローになります。
/dev/zero ===> 出力ファイル
やってみます。実行後、すぐにCtrl+Cします。
takk@deb9:~/tmp$ cat /dev/zero > a.bin ^C takk@deb9:~/tmp$
a.binに格納されたのは、ものすごい量の0値です。
takk@deb9:~/tmp$ ls -lh a.bin -rw-r--r-- 1 takk takk 605M 5月 1 18:46 a.bin takk@deb9:~/tmp$ od -tx1 a.bin | head -2 0000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 * takk@deb9:~/tmp$
次は、間にddコマンドを挟んで、出力サイズを制御してみます。
takk@deb9:~/tmp$ ls takk@deb9:~/tmp$ cat /dev/zero | dd bs=1 count=10 > test.bin 10+0 レコード入力 10+0 レコード出力 10 bytes copied, 0.000183191 s, 54.6 kB/s takk@deb9:~/tmp$ od -tx1 test.bin 0000000 00 00 00 00 00 00 00 00 00 00 0000012 takk@deb9:~/tmp$
1byte入出力単位で、10カウント分出力しました。
bsはデフォルトが512byteなので、bsを指定しないと以下のようになります。
takk@deb9:~/tmp$ cat /dev/zero | dd count=1 > test.bin 1+0 レコード入力 1+0 レコード出力 512 bytes copied, 0.000286236 s, 1.8 MB/s takk@deb9:~/tmp$
次は/dev/zeroを使わない方法。echoで数値0を生成し、パイプでddへ渡し、10 byteのファイルに補完。
takk@deb9:~/tmp$ echo -ne "\x0" | dd ibs=10 conv=sync > test.bin 0+1 レコード入力 0+1 レコード出力 10 bytes copied, 0.000344905 s, 29.0 kB/s takk@deb9:~/tmp$ hd test.bin 00000000 00 00 00 00 00 00 00 00 00 00 |..........| 0000000a takk@deb9:~/tmp$
このように、ddコマンドを使うときは、フィルタとして考えると、覚えやすいししっくりきます。
コメント