連載
» 2017年11月30日 05時00分 公開

Linux基本コマンドTips(163):【 dd 】コマンド――ブロック単位でファイルをコピー、変換する

本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、ブロック単位でファイルをコピー、変換する「dd」コマンドです。

[西村めぐみ,@IT]
「Linux基本コマンドTips」のインデックス

Linux基本コマンドTips一覧

 本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。ブロック単位でファイルをコピー、変換する「dd」コマンドです。

ddコマンドとは?

 「dd」コマンドはファイルをブロック単位で読み出し、指定通り変換して出力します ※1。入力と出力にデバイスを指定できるため、HDDのパーティションをコピーする、USBメモリやCD-ROMのバックアップを取る、といった使い方が可能です。

 処理するブロック数を指定でき、任意のサイズのファイルを作成するといった用途にも役立ちます。

※1 ddコマンドでは一度に処理するデータの単位を「ブロック」と呼ぶ。HDDなどの記録単位であるセクタやブロックの長さと、ddコマンドで指定するブロックの長さが異なっていても処理できる。



ddコマンドの書式

dd [オプション]

※[ ]は省略可能な引数を示しています。




ddの主なオプション(入出力)

オプション 意味
if=ファイル 標準入力の代わりにファイルから読み出す。デバイスファイルも指定可能
of=ファイル 標準出力の代わりにファイルへ書き込む。デバイスファイルも指定可能
bs=バイト数 1回に読み書きするブロックサイズ(バイト数) ※2
ibs=バイト数 1回に読み出すブロックサイズ(デフォルトは512バイト) ※2
obs=バイト数 1回に書き込むブロックサイズ(デフォルトは512バイト) ※2
count=個数 ibsで指定したサイズのブロックを入力から個数分だけコピーする
iflag=フラグ フラグ(表1参照)に従って読み出す。フラグは「,」で区切り、複数指定可能
oflag=フラグ フラグ(表1参照)に従って書き込む。フラグは「,」で区切り、複数指定可能
skip=ブロック数 入力時にibsで指定したサイズのブロックをブロック数分、先頭からスキップする
seek=ブロック数 出力時にobsで指定したサイズのブロックをブロック数分、先頭からスキップする
status=noxfer 処理バイト数や処理速度を表示しない

ddの主なオプション(変換)

オプション 意味
conv=変換方法 変換方法(表2参照)に従って変換する。変換方法の指定は「,」で区切り、複数指定可能
cbs=バイト数 「conv=」で変換方法としてblockまたはunblockを指定した際のブロックのサイズ ※2

※2 バイト数やブロックサイズには2種類の単位を使用可能。1024の累乗で指定する場合はK、M、G、T、P、E、Z、Y(キロ、メガ、ギガ、テラ、ペタ、エクサ、ゼタ、ヨタを意味する)、1000の累乗で指定するときはKB、MB……を使用。



表1 iflag、oflagで使用できるフラグ

フラグ名 意味
directory ディレクトリ以外を指定した場合に失敗させる
nofollow シンボリックリンクをたどらない
noatime アクセス時間を更新しない
nocache キャッシュデータを破棄する
append 追加モードで出力する(oflag=で指定)
direct データに対して直接I/Oを使用する
dsync データに対して同期I/Oを使用する
sync dsyncと同様だがメタデータに対しても使用する
nonblock 非ブロックI/Oを使用する
fullblock 入力のブロックがいっぱいになるまで蓄積してから処理する(iflagのみ)
count_bytes 「count=」をブロック数ではなくバイト数として扱う(iflagのみ)
skip_bytes 「skip=」をブロック数ではなくバイト数として扱う(iflagのみ)
seek_bytes 「seek=」をブロック数ではなくバイト数として扱う(oflagのみ)

表2 convで指定できる主な変換方法 ※3

変換方法 意味
block 改行区切りの入力データを「cbs=」で指定したサイズの固定長データに変換する。指定したサイズより入力データが長い場合は末尾をカットする。短い場合は改行コードを取り除き、「cbs=」で指定したサイズになるまでスペースで埋める
unblock 入力データを「cbs=」で指定した長さ固定長のものと見なし、末尾の空白を削除する
lcase 大文字を小文字に変換する
ucase 小文字を大文字に変換する
sync 各入力ブロックを「ibs=」で指定したサイズになるまでNULL文字で埋める(blockまたはunblockと一緒に指定した場合、NULL文字ではなくスペースで埋める)
sparse NULL文字で埋まった入力ブロックを出力先に書き込まずにスキップする
nocreat 出力ファイルを作成しない
notrunc 出力ファイルを切り詰めない
excl 出力ファイルが既に存在する場合はエラーとする
noerror 読み出しエラー後も処理を続ける
fdatasync 終了前に出力ファイルデータを物理的に書き込む

※3 この他、ASCIIコード以前に作られた文字コードの1つであるEBCDIC(Extended Binary Coded Decimal Interchange Code)とASCIIの変換などが可能





ファイルをコピーする

 「dd if=ファイル1 of=ファイル2」でファイル1をファイル2にコピーできます。この場合、ddコマンドの動作は「ファイル1を読み込んで、そのままファイル2に出力する」となります。なお、if=を指定しなかった場合は標準入力、of=を指定しなかった場合は標準出力を使用します。

 「dd if=/dev/sdb1 of=/dev/sdb2」のようにデバイスを指定することで、デバイスの内容をそのままコピーできます。ただし、このような使い方をする場合、入力元として指定した「/dev/sdb1」と出力先として指定した「/dev/sdb2」のメディアのサイズが同じでなければなりません。

 ddコマンドの定番は、インストールメディアなどをISOイメージとして保存する、という使い方です。画面1では、「/dev/cdrom」にマウントしたメディアの内容を、そのままinstall.isoに保存しています。

コマンド実行例

dd if=/dev/cdrom of=install.iso

(「/dev/cdrom」をそのままinstall.isoに保存する)(画面1


画面1 画面1 /dev/cdromからデータを読み出し、ファイルに変換したところ


指定したサイズのファイルを作成する(1)

 「dd bs=バイト数 count=個数 if=/dev/zero of=ファイル」で、「バイト数×個数」分のサイズのファイルを作成できます(画面2)。

 「/dev/zero」は常にNULL文字(0x00)を出力し続けるという特殊なデバイスです。例えば「dd bs=100 count=1 if=/dev/zero of=file1」なら「file1」という名前の、全てNULL文字で埋まった100バイトのファイルを作成します(内容をodコマンド(連載第93回)で確認可能)。

 bsやcountにはKやMなどの単位が使用可能で、1000の累乗にしたい場合はK、M…、1024の累乗にしたい場合はKB、MB……を指定します。

コマンド実行例

dd bs=100 count=1 if=/dev/zero of=file1

(100バイトのファイルを生成する)(画面2

dd bs=1K count=100 if=/dev/zero of=file2

(102400バイトのファイルを生成する)(画面2

dd bs=1KB count=100 if=/dev/zero of=file3

(100000バイトのファイルを生成する)(画面2


画面2 画面2 指定したサイズのファイルを作成したところ


指定したサイズのファイルを作成する(2)

 ddコマンドのオプションとして「conv=block cbs=サイズ」を指定すると、改行区切りのテキストデータを「cbs=」で指定したサイズの固定長データに変換できます。

 各行の長さが指定したサイズに満たない場合はスペースで埋めます。逆に指定したサイズより長かった場合は切り捨てます。例えば「a、改行、abc、改行」というデータをサイズ2の固定長に変換した場合は「a ab」という2バイト×2ブロックのデータに変わります。

 逆に、オプションとして「conv=unblock cbs=サイズ」を指定したときは、テキストを指定したサイズで分け、改行区切りのデータにします。各ブロック末尾の空白は削除されます。

 画面3の最初の実行例では、seqコマンド(連載第110回)で1〜40までの数字を改行区切りで出力後、ddコマンドで変換しています。ブロックサイズとして10バイトを指定しました(実行画面の幅は80桁です)。

 画面3の次の実行例では、最初の実行例で変換した内容を入力として、trコマンド(第52回)で空白をハイフンに置き換え、再度ddコマンドを使って50桁ごとに改行しています。

コマンド実行例

$ seq 40 | dd cbs=10 conv=block

(10バイトの固定長ブロックに1〜40の数字を埋め込み、数字がない部分には空白を出力する)

$ seq 40 | dd cbs=10 conv=block | tr " " "-" | dd cbs=50 conv=unblock

(1つ前の実行例を読み込み、空白をハイフンに置換し、50バイトの固定長ブロックに変換する)


画面3 画面3 入力ファイルを固定長データに変換したところ 2番目の処理ではファイルの内容を変換し、固定長の長さを50バイトに変えている


筆者紹介

西村 めぐみ(にしむら めぐみ)

PC-9801NからのDOSユーザー。PC-486DX時代にDOS版UNIX-like toolsを経てLinuxへ。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『はじめてでもわかるSQLとデータ設計』『シェルの基本テクニック』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。


Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。