UNIX 講習会 (5)

目次へ

Last modified: Mon Jun 11 16:37:39 2001

2001/6/11


5. UNIX のデータタイプ

この講習会の最初に説明したように、結局のところ 計算機の最終的な利用目的はデータの処理である。UNIX では、 ほとんどのデータはファイルか、パイプを通してやりとりされる。

しかしデータ(情報)というものは、しょせんただのビット列である。 計算機の世界では、データの用途は「データ型 (data type)」と呼ばれる。 データの型には多種多用なものが存在するが、UNIX は OS レベルでは ファイルやパイプ (ストリームで流れるデータ) の型というものを 意識していない (Windows でもこの状況は同じ)。ファイルやパイプを 流れるデータは、ただのビット列として扱われる。これを どのように扱うかはプログラム次第である。ビット列を絵としてみれば それは絵だし、テキストとしてみればテキストになる (実際には、ほどんどの形式のファイルには先頭にそのファイルの型を 示すマーク (マジックナンバー, magic number と呼ばれる) が入っていることが 多い)。ファイル中の最小単位は 1バイト (=1オクテット = 8ビット) である。

あるファイルをビット列として見たいときは、od を使う。 -tx1 オプションをつけると、od は入力ファイルの 各バイトを16進出力する。

% od -Ax -tx1 ~/.cshrc
0000000 23 20 2e 63 73 68 72 63 20 66 6f 72 20 65 75 73
0000010 6b 65 0a 0a 73 65 74 20 70 61 74 68 20 3d 20 28
0000020 20 7e 2f 62 69 6e 20 2f 75 73 72 2f 6c 6f 63 61
...

これは新山の ~/.cshrc の先頭部分である。 16進出力のかわりに文字で見たい場合は -ta を使う。 (問. ただし、漢字は見れない。なぜか?)

% od -Ad -ta ~/.cshrc
0000000   #  sp   .   c   s   h   r   c  sp   f   o   r  sp   e   u   s
0000016   k   e  nl  nl   s   e   t  sp   p   a   t   h  sp   =  sp   (
0000032  sp   ~   /   b   i   n  sp   /   u   s   r   /   l   o   c   a
...

UNIX で扱うデータ (用途別)

テキスト文書
テキストファイルは、ただ文字コードを出てくる順に並べただけの 単純な構造をしている。 改行には専用の改行文字 (この文字は UNIX, Mac, Windows(DOS) によって それぞれ異なる) が含まれる。

UNIX はテキストファイルを処理するために発展してきたので、 テキストを見たり処理するためのプログラムが豊富にある。

プログラム
プログラムファイル (実行可能バイナリファイル) には、 機械語が含まれている。これは機種によって異なっており、 互換性がない。実際には実行可能バイナリファイルには、 プログラムのコードだけではなく、デバッグやリンクについての シンボル情報も含まれている。

プログラムファイルは、通常コンパイラやリンカで生成する。 エディタでこれらのバイナリを直接編集することはまずない。 ただし、プログラムファイル中のシンボルや、プログラム中に 埋め込まれた「文字列定数らしきもの」をとりだすことはできる。

プログラムファイルを less などで見ても、文字列定数以外は ほとんど意味不明である。また、プログラムファイルを cat などで 直接端末に出力すると、kterm などがおかしくなるのが見れるだろう。 このような場合は kterm 上で Control-Button2 を押して、 メニューから「Do Full Reset」を選べばなおる。

画像・書式指定ファイル
画像ファイルの形式は、大きく「ビットマップ画像形式」と 「ベクトル画像形式」に分けられる。

ビットマップ画像形式は、画面に表示されるピクセル (pixel, 点) に関する情報を直接含んでいる。いっぽうベクトル画像形式は 画面に表示される図形 (直線や円など) の抽象的な情報が ある言語によって表現されている。ビットマップ画像は 一般にディスプレイ指向であり、引き述ばすとギザギザになる。 いっぽうベクトル画像は印刷指向であり、プリンタの解像度によらず つねにスムースな出力が得られる。

画像ファイルを less などで見ても、ほとんど意味不明である。 通常、多くの画像ファイルは専用のアルゴリズム (LZH 法など) によって 圧縮されているからだ (GIF, JPEG, PNG)。しかし、XPM や BMP などの形式は「何か画像っぽい」のがわかることもある。 また PostScript や PDF は一種のプログラミング言語であるので、 わかる人が見れば理解できることもある。

その他バイナリファイル
その他のバイナリファイルには、おもにデータベースのインデックスが ある。これは逐次的なファイルの特定の部分にすばやくアクセスするための 情報で、たとえばハッシュテーブルやトライなどがこれにあたる。 このようなファイルはテキストでも作れるが、一般的にバイナリファイルで あることが多い。

UNIX で扱うデータ (ファイル別)

ファイルの識別方法

1. 拡張子で見分ける:
UNIX では、ふつうはテキスト
.txtテキスト
.htm .htmlHTML
.c .h .C .H .ccC、C++ ソース
.o .a .soオブジェクトファイル
.pl .prlperl (まれに Prolog のこともある)
.shシェルスクリプト
.el .elcEmacs Lisp
.java .class .jarJava
.tex .dvi .aux .log .def .styTeX関係
.bib .bbl .blgBibTeX関係
.gif .jpg .jpeg .png .xpm .xbm .tif .tiffビットマップ画像
.objTgif
.ps .epsPostScript
.pdfPDF
.tar .gz .bz2 .zip .lzhアーカイブファイル

2. file コマンドで見分ける:

拡張子でわからないファイルの場合は、ファイルの内容を識別する file コマンドというものが用意されている。でも、ときどき判定に失敗する (日本語のテキストファイルをバイナリと解釈してしまう)。

% file /bin/ls
/bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), stripped
% file ronbun.dvi
ronbun.dvi: TeX DVI file (TeX output 2001.04.24: 1727)
% file /etc/motd
/etc/motd: ASCII text

3. 目で見分ける:

最終手段としては、 less や od などを使って、どんなデータ形式なのか 見当をつけるというものがある。でも、こんなことは普通やらない。

ファイルを見る

通常のテキストファイル
  • less (漢字コードおよび改行を自動的に判定するが、 Unicode は見えないし、判定もときどき間違える)
  • lv (less より賢い漢字コード判定、Unicode も見える)
  • grep, egrep, fgrep, lgrep (文字列検索)
    • grep: 基本的な正規表現 ([], *, ?, .)
    • egrep: 拡張正規表現 (perl とほぼ同等)
    • fgrep: 正規表現ではない文字列
    • lgrep: grep と同じだが、 漢字コードが異なるテキストを検索できる
HTML
lynx を使うか、netscape の引数に直接ファイル名を指定する。
ビットマップ画像ファイル (GIF, JPEG, PNG, XPM, BMP)
xv。それでもだめな場合は、display や gimp を使う。
DVIファイル
xdvi
PostScriptファイル
gv
PDFファイル
acroread
アーカイブファイル
  • .tar : tar tv
  • .tar.gz : tar ztv
  • .tar.bz2 : tar ytv
  • .zip : unzip -l
  • .lhz : lha l

ファイル形式を変換

PostScript に変換 (印刷のため)
UNIX からプリンタで印刷するには、とにかく最終的に PostScript 形式になっている必要がある。いったん PostScript に変換できれば、あとは lpr を使ってプリンタにその データを送ることで印刷できる。また、TeX 文書に 取り込む画像も PostScript になっている必要がある。
HTML に変換 (web で公開するため)
画像に変換

画像 → 画像に変換するときは、UNIX では PNM という形式を 介するとフィルタが充実している。

アーカイブに変換 (圧縮)

問題. UNIX の画面イメージを TeX の文書に貼りつけたい。どうすればいいか。

問題. PDF ファイルの文書のある部分のある文字だけを切り出して web に載せたい。どうすればいいか。


less, lv のキー操作
1ページ進むspace
1ページ戻るb
1行進むj または Control-N または Return
1行戻るk または Control-P
ファイルの先頭へ<
ファイルの末尾へ>
ファイルの指定された行へ行番号 + g
ファイルの指定された位置へパーセント + p
順方向検索/ + 正規表現
次の候補n
逆方向検索?(shift+/) + 正規表現
前の候補N(shift+n)
画面が崩れたときに再描画するControl-L
エディタで編集するv (通常 vi を起動)
終了q

lynx のキー操作
1ページ進むspace
1ページ戻るb
1行進むj または Control-N
1行戻るk または Control-P
ファイルの先頭へControl-A
ファイルの末尾へControl-E
次のリンクカーソル下
前のリンクカーソル上
リンクをたどるReturn
リンク先をダウンロードd
イメージリンクを表示*
URL を開くg
リロードControl-R
順方向検索/ + パターン
次の候補n
ブックマークに追加a
ブックマークを見るv
ソースを見る\
履歴を見るControl-H
オプション設定o
読み込み中止Control-G
画面が崩れたときに再描画するControl-L
終了q

小言:


^ front   新山 祐介 euske@cl.cs.titech.ac.jp