Linux講座にようこそ。このページは「Linuxの使い方 - 第4章 ファイル操作のコマンド2」です。

Linuxの使い方

4. ファイル操作のコマンド2(5/5)

4.3 コマンドのご紹介2(4/4)

4.3.12 その他、知っておくと便利なコマンド(file、ln、wc、nkf、od、cmpコマンド)

ここでは、次のコマンドの説明を行います。

fileコマンド
ファイルの内容を解析して種別を表示します。
lnコマンド
ファイルに複数のパス名を付加します。
wcコマンド
ファイルに格納されているデータのバイト数、単語数、行数などを表示します。
nkfコマンド
文字コード(UTF-8やシフトJIS等)を変換します。
odコマンド
ファイルの内容を八進数や十六進数で表示します。
cmpコマンド
2つのファイルの内容を比較します。

Fedoraの場合、標準ではnkfコマンドはインストールされないようですので、個別にインストールする必要があります。

一般形式

$ file ファイルパス名1 ファイルパス名2 …
$ ln -s 元のファイルパス名 新しいファイルパス名
$ wc -cwl ファイルパス名1 ファイルパス名2 …
$ nkf -jeswcd ファイルパス名
$ od -cx ファイルパス名1 ファイルパス名2 …
$ cmp -ls -i バイト1:バイト2 -n バイト ファイルパス名1 ファイルパス名2

fileコマンドのオプションに付いては省略します。

lnコマンドはファイルに複数のパス名を付加しますが、これは別名をつけると思っていただければよいでしょう。別名の付け方として、ハードリンクとシンボリックリンクと呼ぶ2つの方法があります。ハードリンクはファイルに対して別名を付けるだけで、ディレクトリに別名を付けることは出来ませんし、別のファイルシステムのファイルや、ディレクトリに別名を付けることも出来ません。これに対して、シンボリックリンクはディレクトリに別名を付けることも出来ますし、別のファイルシステムのファイルや、ディレクトリに別名を付けることも出来ます。

【表4-23】lnコマンド・オプション
オプション意味
-s, --symbolicシンボリックリンク(ソフトリンク)と呼ぶリンクを作成します。指定しない場合はハードリンクを作成します。

wcコマンドのオプションを省略した場合は、バイト数・単語数・行数を表示します。

【表4-24】wcコマンド・オプション
オプション意味
-c, --bytesバイト数を表示します。
-w, --words単語数(ワード数)を表示します。
-l, --lines行数を表示します。
-m, --chars文字数を表示します。日本語の漢字や平仮名はもちろん、半角スペースや改行も1文字と数えます。
【表4-25】nkfコマンド・オプション
オプション意味
-jJISコードに変換します。
-e日本語EUCコードに変換します。
-sシフトJISコードに変換します。
-wUTF-8コードに変換します。
-c改行コードとして、NL(New Line)の後ろにCR(Carriage Return)を付加します。これはMS-DOSやWindowsのテキストファイル形式です。
-dNLの後ろのCRを削除します。

odコマンドは「-t 表示形式」または「--format=表示形式」オプションで表示形式を指定できますが、同じことが表4-26のオプションでもできます。こちらは直接表示種別を指定していることになります。なお、オプションを指定しない場合は八進数として表示します。

【表4-26】odコマンド・オプション
オプション意味
-cASCIIコードで表示します。「-t c」及び「--format=c」でも同じです。
-x十六進数として表示します。当オプションを省略すると八進数として表示します。「-t x」及び「--format=x」でも同じです。

cmpコマンドはバイト単位に比較しますので、バイナリファイルの比較もできます。また、比較するファイルとして-(負記号)を指定すると、標準入力からの入力となります。比較結果は終了ステータスで分かります。0の場合は同じ、1の場合は異なる、2の場合はエラー発生を表します。

【表4-27】cmpコマンド・オプション
オプション意味
-l, --verbose異なる全てのバイトの情報(オフセット行とバイト数)を表示します。
-s, --quiet, --silentなにも表示しません。(シェルスクリプトで使うときに便利かもしれません)
-i バイト1:バイト2,
--ignore-initial=バイト1:バイト2
比較するファイルのバイト1あるいはバイト2までをスキップ(比較しない)します。バイト2は2つ目のファイルに対する指定です。
-n, --bytes=バイトファイルの先頭から指定したバイト数分だけ比較します。

実行例

カレントディレクトリの下のファイルの種類を調べます。

$ file *
BKUP:    directory
a.out:   ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), not stripped
file1:   EUC text
prg1.c:  C program text
scr1.sh: Bourne-Again shell script text
$

./a.outに別名(ハードリンク)../../mybin/hello.prgを付けます。

$ ls -l a.out
-rwxr-xr-x 1 merry merry 4667 2010-11-17 17:11 a.out
$
$ ln a.out ../../mybin/hello.prg
$
$ ls -l a.out ../../mybin/hello.prg
-rwxr-xr-x 2 merry merry 4667 2010-11-17 17:11 ../../mybin/hello.prg
-rwxr-xr-x 2 merry merry 4667 2010-11-17 17:11 a.out
           ↑ リンク数と呼ばれているもので、
この場合、1つのファイル実体が2つの名前(パス)を持っていることを表わします
$
$ rm a.out ← a.outを削除します
$ ls -l ../../mybin/hello.prg
-rwxr-xr-x 1 merry merry 4667 2010-11-17 17:11 ../../mybin/hello.prg
           ↑ a.outを削除したため、リンク数が1になりました
$

TMP/BACKUPディレクトリに別名(シンボリックリンク)MYBKUPを付けます。

$ ln -s ./TMP/BACKUP MYBKUP
$ ls -ld MYBKUP
lrwxr-xr-x  1 merry users 13 10月  5 17:21 MYBKUP -> ./TMP/BACKUP/
↑「l」はシンボリックリンクであることを表わし、
MYBKUP -> ./TMP/BACKUP/は./TMP/BACKUP/へのシンボリックリンクであることを表わします
$
$ ls MYBKUP
merry.tar.bz2  merry_back.tar.bz2  merryall.tar.bz2
$

カレントディレクトリの下のmemo.txtファイルのバイト数、単語数、行数、文字数を表示します。

$ cat memo.txt
Hello World.

今日は世界

(^ ^);
$ wc memo.txt
 5  5 38 memo.txt ← 行数、単語数、バイト数の順で表示します
$
$ wc -c memo.txt
38 memo.txt ← バイト数のみ表示します
$
$ wc -w memo.txt
5 memo.txt ← 単語数のみ表示します
$
$ wc -l memo.txt
5 memo.txt ← 行数のみ表示します
$
$ wc -m memo.txt
28 memo.txt ← 文字数のみ表示します
$

Windowsで作成したファイル(シフトJIS)をLinuxで取り扱えるファイル(UTF-8)に変換します。変換結果は標準出力に出力されますので、ファイルに保存したい場合はリダイレクトします。

$ nkf -wd winfile.txt > linuxfile.txt
$

カレントディレクトリの下のa.outファイルの内容を十六進数とASCIIコードで表示します。

$ od -x a.out ← -xオプションを指定して十六進数で表示します
0000000 457f 464c 0102 0001 0000 0000 0000 0000
0000020 0002 003e 0001 0000 0440 0040 0000 0000
0000040 0040 0000 0000 0000 1168 0000 0000 0000
0000060 0000 0000 0040 0038 0009 0040 001e 001b
0000100 0006 0000 0005 0000 0040 0000 0000 0000
(以下省略)
$
$ od -xc a.out | head ← -xcオプションを指定して十六進数とASCIIコードで表示します(headコマンで先頭から10行だけを表示)
0000000    457f    464c    0102    0001    0000    0000    0000    0000
        177   E   L   F 002 001 001  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000020    0002    003e    0001    0000    0440    0040    0000    0000
        002  \0   >  \0 001  \0  \0  \0   @ 004   @  \0  \0  \0  \0  \0
0000040    0040    0000    0000    0000    1168    0000    0000    0000
          @  \0  \0  \0  \0  \0  \0  \0   h 021  \0  \0  \0  \0  \0  \0
0000060    0000    0000    0040    0038    0009    0040    001e    001b
         \0  \0  \0  \0   @  \0   8  \0  \t  \0   @  \0 036  \0 033  \0
0000100    0006    0000    0005    0000    0040    0000    0000    0000
        006  \0  \0  \0 005  \0  \0  \0   @  \0  \0  \0  \0  \0  \0  \0
$

カレントディレクトリの下の2つのファイルの内容を比較します。

$ cat file_1.txt
Hello World. ← 以下3行がfile_1.txtファイルの内容です

2015年 10月 25日 日曜日 09:26:45 JST
$
$ cat file_2.txt
Hello world. ← 以下3行がfile_2.txtファイルの内容です

2015年 10月 25日 日曜日 09:27:07 JST
$
$ cmp file_1.txt file_2.txt ← オプションの指定をしていません
file_1.txt file_2.txt 異なります: バイト 7、行 1
$
$ cmp -l file_1.txt file_2.txt ← -lオプションを指定して異なる部分の位置と内容を表示します
 7 127 167
49  66  67
51  64  60
52  65  67
$