1 ddコマンドとは?
データのコピーや変換を行うコマンドです。
2 検証環境
CentOS版数は以下のとおりです。
[root@server ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)
カーネル版数は以下のとおりです。
[root@server ~]# uname -r 3.10.0-1160.el7.x86_64
ddコマンドの版数は以下のとおりです。
[root@server ~]# dd --version dd (coreutils) 8.22 -snip-
3 オプション一覧
オプションは以下のとおりです。
[root@server ~]# dd --help 使用法: dd [OPERAND]... または: dd OPTION Copy a file, converting and formatting according to the operands. bs=BYTES read and write up to BYTES bytes at a time cbs=BYTES convert BYTES bytes at a time conv=CONVS convert the file as per the comma separated symbol list count=N copy only N input blocks ibs=BYTES read up to BYTES bytes at a time (default: 512) if=FILE read from FILE instead of stdin iflag=FLAGS read as per the comma separated symbol list obs=BYTES write BYTES bytes at a time (default: 512) of=FILE write to FILE instead of stdout oflag=FLAGS write as per the comma separated symbol list seek=N skip N obs-sized blocks at start of output skip=N skip N ibs-sized blocks at start of input status=LEVEL The LEVEL of information to print to stderr; 'none' suppresses everything but error messages, 'noxfer' suppresses the final transfer statistics, 'progress' shows periodic transfer statistics N and BYTES may be followed by the following multiplicative suffixes: c =1, w =2, b =512, kB =1000, K =1024, MB =1000*1000, M =1024*1024, xM =M GB =1000*1000*1000, G =1024*1024*1024, and so on for T, P, E, Z, Y. -snip-
4 コピーする方法
ここでは、ファイルX(in.txt)の任意の場所から任意のサイズをファイルY(out.txt)にコピーする方法を説明します。
4.1 事前準備
9バイトのファイルを作成します。テスト結果を確認しやすいよいうに、-nオプションを指定して、改行コード(0x0a)を出力しないようにします。
[root@server ~]# echo -n 123456789 > in.txt
作成したファイルを確認します。9バイトのテキストファイルであることがわかります。
[root@server ~]# od -tx1 in.txt 0000000 31 32 33 34 35 36 37 38 39 0000011
4.2 すべてをコピーする方法
in.txtのデータをすべてout.txtにコピーしてみます。
[root@server ~]# dd if=in.txt of=out.txt 0+1 レコード入力 0+1 レコード出力 9 バイト (9 B) コピーされました、 0.000404049 秒、 22.3 kB/秒
作成したファイルを確認します。全てがコピーされたことがわかります。
[root@server ~]# od -tx1 out.txt 0000000 31 32 33 34 35 36 37 38 39 0000011
4.3 最初から途中までコピーする方法(count)
最初から5バイト目までをコピーしてみます。
[root@server ~]# dd if=in.txt of=out.txt bs=1 count=5 5+0 レコード入力 5+0 レコード出力 5 バイト (5 B) コピーされました、 0.00087815 秒、 5.7 kB/秒
作成したファイルを確認します。最初から5バイト目までがコピーされたことがわかります。
[root@server ~]# od -tx1 out.txt 0000000 31 32 33 34 35 0000005
4.4 途中から最後までコピーする方法(skip)
最初から7バイトスキップして、8バイト目から最後までをコピーしてみます。
[root@server ~]# dd if=in.txt of=out.txt bs=1 skip=7 2+0 レコード入力 2+0 レコード出力 2 バイト (2 B) コピーされました、 0.000875829 秒、 2.3 kB/秒
作成したファイルを確認します。8バイト目から最後までがコピーされたことがわかります。
[root@server ~]# od -tx1 out.txt 0000000 38 39 0000002
4.5 途中の一部分をコピーする方法(skip,count)
最初から2バイトスキップして、3バイト目から5バイトコピーしてみます。
[root@server ~]# dd if=in.txt of=out.txt bs=1 skip=2 count=5 5+0 レコード入力 5+0 レコード出力 5 バイト (5 B) コピーされました、 0.000714718 秒、 7.0 kB/秒
作成したファイルを確認します。3バイト目から7バイト目までがコピーされたことがわかります。
[root@server ~]# od -tx1 out.txt 0000000 33 34 35 36 37 0000005
5 大文字・小文字の変換方法
5.1 大文字への変換(ucase)
変換前のファイルの中身を確認します。小文字であることがわかります。
[root@server ~]# cat in.txt abcde
小文字を大文字に変換します。
[root@server ~]# dd if=in.txt of=out.txt conv=ucase 0+1 レコード入力 0+1 レコード出力 6 バイト (6 B) コピーされました、 0.000748171 秒、 8.0 kB/秒
ファイルを確認します。小文字から大文字に変換されたことがわかります。
[root@server ~]# cat out.txt ABCDE
5.2 小文字への変換(lcase)
変換前のファイルの中身を確認します。大文字であることがわかります。
[root@server ~]# cat in.txt ABCDE
大文字を小文字に変換します。
[root@server ~]# dd if=in.txt of=out.txt conv=lcase 0+1 レコード入力 0+1 レコード出力 6 バイト (6 B) コピーされました、 0.000833123 秒、 7.2 kB/秒
ファイルを確認します。大文字から小文字に変換されたことがわかります。
[root@server ~]# cat in.txt ABCDE
6 コピーの進捗状況を表示する方法(staus)
6.1 進捗状況の表示を抑止する方法(status=none)
noneを指定すると、データをコピーしているときの状況を一切表示しません。
[root@server ~]# dd if=/dev/zero of=test.dat bs=1 count=10 status=none [root@server ~]#
6.2 進捗状況を表示する方法(status=progress)
stausにprogressを指定すると、データのコピー状況が表示されます。作成するファイルサイズが小さいと、途中の状況が確認できないので、ここでは、サイズが大きい(1G)ファイルを作成しました。
[root@server ~]# dd if=/dev/zero of=test.dat bs=1024 count=1000000 status=progress 600811520 バイト (601 MB) コピーされました, 2.000004 s, 300 MB/s
7 その他
ddコマンドを使って、以下のファイルを作成してみます。
+----------------+ -*- -*- -*- | | | | | | zero.dat | 1024(byte) | | | | | | | +----------------+ -*- 9416(byte) | | | | | | | tp | 8392(byte) | | | | | | | +----------------+ -*- -*- 9579(byte) | | | | | ls.dat.gz | 163(byte) | | | | | +----------------+ -*- --*-
7.1 中身が0のファイル作成
中身が0の1024バイトのファイルを作成します。
[root@server ~]# dd if=/dev/zero of=zero.dat bs=1024 count=1
ファイルのサイズを確認します。
[root@server ~]# ls -l zero.dat -rw-r--r--. 1 root root 1024 5月 9 20:07 zero.dat
7.2 実行ファイルの作成
[root@server ~]# cat tp.c #include <stdio.h> int main() { printf("Hello\n"); return 0; }
ソースファイルをコンパイルします。
[root@server ~]# gcc -Wall -o tp tp.c
テストプログラムを実行します。
[root@server ~]# ./tp Hello
実行ファイルのサイズを確認します。
[root@server ~]# ls -l tp -rwxr-xr-x. 1 root root 8392 5月 9 20:09 tp
7.3 圧縮ファイルの作成
[root@server ~]# ls /boot/ > ls.dat
ファイルを圧縮します。
[root@server ~]# gzip ls.dat
圧縮したファイルのファイルサイズを確認します。
[root@server ~]# ls -l ls.dat.gz -rw-r--r--. 1 root root 163 5月 9 20:49 ls.dat.gz
7.3 ファイルの結合
ddコマンドを使って、作成した3つのファイルを1つのファイルに結合してみます。
[root@server ~]# dd if=zero.dat of=test.dat seek=0 obs=1024 oflag=seek_bytes [root@server ~]# ls -l test.dat -rw-r--r--. 1 root root 1024 5月 9 20:35 test.dat
[root@server ~]# dd if=tp of=test.dat seek=1024 obs=8392 oflag=seek_bytes [root@server ~]# ls -l test.dat -rw-r--r--. 1 root root 9416 5月 9 20:43 test.dat
[root@server ~]# dd if=ls.dat.gz of=test.dat seek=9416 obs=163 oflag=seek_bytes [root@server ~]# ls -l test.dat -rw-r--r--. 1 root root 9579 5月 9 20:57 test.dat
Z 参考情報
私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ