dd - ファイルをコピーする

スポンサーリンク

ddコマンドは、ファイルのコピーを行うコマンドです。

単純なファイルのコピーのほかに、SDカード等のデバイスにイメージファイルをコピーすることにも利用することができます。

ddコマンドとは

ddコマンドは、ファイルをコピーします。
デフォルトでは標準入力を標準出力にコピーします。

その際、入力と出力のブロックサイズを変更することができます。
ブロックサイズは、ファイルシステムによって最適化すると、処理時間を高速化できます。

また、ファイルをコピーする際に、テキストファイルの内容をすべて大文字にする等の変換もできます。

ddコマンドは、ファイルのコピーやデバイスのコピー、バックアップなどに利用できます。
しかし、ほとんどのオペレーティングシステムによって、ディレクトリへのI/O操作は許されていないため、ディレクトリのコピーは行うことができません。
通常、ファイルのコピーやディレクトリのコピーなどにcpコマンドを用いて、デバイスのイメージファイルの作成やディスクのバックアップなどにddコマンドを用います。

ddコマンドの構文

ddコマンドの構文

operandについて

オペランド意味
if=入力ファイル
of=出力ファイル
ibs=入力のブロックサイズ(デフォルト:512bytes)
obs=出力のブロックサイズ(デフォルト:512bytes)
bs=入出力のブロックサイズ(ibsやobsより優先)
cbs=変換のブロックサイズ
skip=ibsのブロックの個数をスキップ
seek=obsのブロックの個数をスキップ
count=ibsのブロックの個数をコピー
status=メッセージの表示について(下の別表を参考)
conv=変換処理について(下の別表を参考)
iflag=入力ファイルのアクセスについて(下の別表を参考)
oflag=出力ファイルのアクセスについて

statusについて

status意味
nonestderrに情報を表示しない
noxfer最終行に転送レートを表示しない
progress進捗を表示

convについて

conv意味
asciiEBCDICをASCIIに変換
ebcdicASCIIをEBCDICに変換
ibmASCIIをEBCDICのIBMバージョンに変換
block入力の各行をcbsだけ出力
改行はスペースになり、必要ならばcbsになるようにスペースで埋める
unblockcbsごとに出力。末尾スペースは削除
lcase大文字を小文字に変換
ucase小文字を大文字に変換
syncibsごとに出力。必要ならば、末尾はゼロバイトで埋める
excl出力ファイルが既に存在するならば、失敗
nocreat出力ファイルを作成しない
notrunc出力ファイルを切り捨てない
noerrorエラーが出ても処理を続ける
fdatasyncファイルのデータ部分に対してディスクへの書き出しを保証
fsyncファイルに対してディスクへの書き出しを保証

flagについて

flag意味
count_bytesiflagで使用可能。countをバイトカウントにする。
skip_bytesiflagで使用可能。skipをバイトカウントにする
seek_bytesiflagで使用可能。seekをバイトカウントにする。
スポンサーリンク

ddコマンドの利用例

ファイルをコピー
(オペランドなし)

ddコマンドは、デフォルトでは標準入力を標準出力にコピーします。
最後に標準エラー出力に転送情報を出力します。

コマンド例

file.txt

実行結果

以下の部分は標準エラー出力になります。

ファイルの入力
(if=file)

if=のオペランドは、標準入力の代わりにif=で指定したファイルをddコマンドの入力とすることができます。

コマンド例

実行結果

ファイルの出力
(of=file)

of=のオペランドは、標準出力の代わりにof=で指定したファイルをddコマンドの出力とすることができます。

コマンド例

実行結果(output.txt)

実行結果(標準エラー出力)

ブロックサイズについて
(bs=num)

bs=のオペランドは、入力と出力のブロックサイズを指定できます。
デフォルトは512bytesになります。このブロックサイズはddコマンドのバッファになります。

ブロックサイズを変更することでddコマンドの処理時間を高速化することができるかもしれません。
ファイルシステムのブロックサイズと同じブロックサイズを指定すると処理時間は最適になります。また、ブロックサイズをそれ以上大きくしても処理時間がほとんど変わらなくなります。
ほとんどのファイルシステムのブロックサイズには、4096bytesが利用されています。

ブロックサイズの確認には、管理者権限が必要ですが以下のようなコマンドが利用できます。ディスクパーティションをしていない等、PC環境によってはデバイスファイル/dev/sda1については変更する必要があるかもしれません。

また、管理者権限がない場合は以下のコマンドが利用できます。

大きいサイズの空ファイルの作成

ddコマンドは大きいサイズの空ファイルの作成を行うことができます。

空ファイルを作る際、どのくらいのサイズを作成するかどうかを決める必要があります。
そのサイズは、count=のオペランドを使用します。

その際、iflag=count_bytesを用いるとより都合がいいです。
なぜなら、単純にcount=のオペランドを使う場合、bs × countでサイズを計算しなければなりません。
しかし、count_bytesを用いるとcount=のオペランドで指定した数値をバイト数として使用することができます。

コマンド例では、1G(2^30)バイトの空ファイルを作成します。

コマンド例

実行結果(標準エラー出力)

進捗の表示
(status=progress)

status=progressをオペランドとして利用すると、1秒毎に転送レートを更新します。

コマンド例では、1G(2^30)バイトの空ファイルを作成します。ただし、進捗を確認するため、処理時間を長くするようにブロックサイズを小さくしてます。

コマンド例

実行結果(実行中の表示例)

参考

Gnu Coreutils

Gnu Coreutils日本語版

ddコマンドの構文について、他のflagについてはmanのほかにopen関数も参考になります。
fsyncやfdatasyncについてはfsync関数が参考になります。