hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

ddコマンドの使い方



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技術ブログ