皆さんの計算機に搭載されている UNIX の代表的なディレクトリを示す.
/: root ディレクトリ /bin シェルや cp, mvなどの基本コマンドを置く /dev 入出力機器などのデバイスファイルを置く /etc システムの起動等に必要な管理用のコマンド,データを置く /home 利用者のホームディレクトリを置く(固定ではない) /mnt ファイルシステムを一時的にマウントするのに使用 /proc プロセステーブル /root root(管理者)のためのホームディレクトリ /sbin シングルユーザまでのブートや /usr のマウント等の実行ファイル /tmp 万人が利用できる一時的な作業領域 /usr この下に様々なシステムが広がっている /var variable(可変の)という意味で,各種のログやもう一つの tmp 領域がある /opt 主に,メーカ製のソフトウェアなどがインストールされる場所(無い場合もある) /usr: usr ディレクトリ /usr /bin から溢れた基本コマンドを格納 /usr/lib ライブラリファイルの置き場所 /usr/local 管理者が自分で作るローカルな環境を置くための場所 /usr/sbin システム管理者用のコマンドが置いてある /usr/share マニュアルや辞書など,共有されるものが置かれる /var: var ディレクトリ /var/log messages や wtmp などの各種ログが残る /var/spool プリンタ関連のスプール /var/tmp /tmp 同様に一時的な作業ファイルの置き場所であるが,reboot しても消されない
ログインしたとき,利用者ごとに,木構造上の一つの場所がシステムから割り当てられる.この場所を,ホームディレクトリ (home directory) といい,ここがその利用者の作業の基点になる.いつでもホームディレクトリを中心に作業をするのでは不便なことがある.例えば,図 3.1で,ホームディレクトリがルートであると仮定すると,ホームディレクトリからファイルを指定するのではなく,「enshu1」 (または 「enshu2」)を中心に指定できる方が便利なことがある.このようなとき,作業に一番都合のよいディレクトリを設定して,ここを中心に考える仕組が用意されている.このように設定するディレクトリを(現)作業ディレクトリ (current working directory) という.ログインの時点では,ホームディレクトリが作業ディレクトリである.
作業ディレクトリを適切に設定することは,作業効率を向上させるだけでなく,ファイル操作の間違いを防ぐことにも役立つ.
通常は一般の利用者(すなわちあなたたちのことである)は,各自のホームディレクトリ以下のファイルのみを自由に扱うことができ,それ以外のファイルを変更することができない.つまり,作業はホームディレクトリ下で行う.
ホームディレクトリ以外の場所にあるファイルは管理者のみが変更できる.これらのファイルはシステムの動作にかかわる重要なものであるので一般の利用者が自由に変更できないようになっているのである.
(注)図 3.1 では 「/」 がホームディレクトリのように描かれているが,これは,ディレクトリの階層構造を説明するために簡略化したためであって,実際には,「/home」 の下にホームディレクトリがある.
さて,ここまでで,UNIXのファイルシステムのおおまかなイメージができたと思う.この節では,基本的なディレクトリの操作コマンドを説明する.ここで示すのは各コマンドの一部の使用例についてなので,詳細についてはそれぞれのマニュアルを参照すること.例として使用するディレクトリ構造を図 3.2 に示す.
図 3.2: 使用するディレクトリ構造の例
■作業ディレクトリを知る pwd
現在の作業ディレクトリを知るのには pwd (print current working directory) コマンドを使う.
$ pwd/home/cs9000
例のように,作業ディレクトリは絶対パス名で表示される.
■作業ディレクトリの変更 cd
ディレクトリの間は自由に動きまわることができ,これには cd (change working directory) コマンドを使う.これは,作業ディレクトリの変更でもある.
$ cd ディレクトリのパス名![]()
である.ここで,ディレクトリのパス名は,相対パス名でも絶対パス名でもよく,相対パス名は,作業ディレクトリを起点とする指定となる.
例えば図 3.2 で,ホームディレクトリから 「enshu」 に作業ディレクトリを変更するのには,
$ pwd/home/cs9000 $ cd enshu
$ pwd
/home/cs9000/enshu
とすればよい.ここでは,pwd コマンドは作業ディレクトリを確認するのに使用している.
便利な指定方法として,記号「.」と「..」がある.「.」は作業ディレクトリを,「..」は親ディレクトリ(つまり,一つ上のディレクトリ)を指す.例えば,親のディレクトリに移りたいときは,
$ cd ..![]()
とすればよく,兄弟ディレクトリ 「jikken」 に移るのであれば,
$ pwd/home/cs9000/enshu $ cd ../jikken
![]()
とすればよい.
bash では,記号「~(チルダ)」をホームディレクトリの簡略形として使用できる.単に~ だけを指定したときには,自分(ログインしている利用者)のホームディレクトリとなる.例えば,
$ cd ~![]()
は,自分のホームディレクトリに移動し,
$ cd ~/enshu![]()
は,自分のホームディレクトリの下にあるディレクトリ 「enshu」 に移動する.また,「~」 の後に利用者名を付けると,指定した利用者のホームディレクトリを意味することになる.例えば,
$ cd ~username![]()
は,username という利用者名を持つ利用者のホームディレクトリへ移動する.
引数なしで cd コマンドを実行することでも,ホームディレクトリへ移動できる.つまり,いろいろなディレクトリで作業を行った後,ホームディレクトリに戻りたければ,どのディレクトリにいても
$ cd![]()
で,ホームディレクトリに戻ることができる.これは,前述した「cd ~」と同じ意味である.
■ディレクトリ内容の表示 ls
ディレクトリにどんな名前のファイルがあるのかを知るのには ls (list contents of a directory) コマンドを使用する.作業ディレクトリにあるファイル名を表示させるのには,次のようにする.
$ cd$ ls
a.out enshu jikken kuku.c
結果は,ファイル名が辞書順に整列されて表示される.例では,四つのファイルがあることがわかる.しかし,これではディレクトリなのか,ファイルなのかはわからない.ファイルの種類を知るのには 「-F」オプションがあり,結果は次のようになる.
$ ls -Fa.out* enshu/ jikken/ kuku.c
ファイルの種類は,ファイル名の後に次の記号で表示される.
/ ディレクトリ * (通常ファイルの中で)実行可能なファイル 何も表示されていないファイルは,通常ファイル,または,特殊ファイル. ファイルについてもっと詳しい情報を知りたいときは 「-l」 オプションを指定する.
$ ls -l-rwxr-xr-x 1 cs9000 24576 Mar 22 20:01 a.out drwxr-xr-x 1 cs9000 512 Apr 1 09:00 enshu drwxr-xr-x 1 cs9000 512 Apr 1 09:10 jikken -rw-r--r-- 1 cs9000 173 Mar 22 18:51 kuku.c
この指定の結果は,一行に一つのファイルの情報が表示され,各項目の意味は次のとおりである.
![]()
(1) ファイルの種類
-: 通常ファイル
d: ディレクトリ(2) パーミッション
(アクセスの権利を示す.これによって,ファイルは持ち主以外のユーザから保護される)(3) リンク数 (4) ファイルの所有者 (5) 使用バイト数 (6) 最新の更新時刻 (7) ファイル名 この他によく使用される ls のオプションに 「-a」 がある.UNIX では,記号「.」で始まる名前のファイルは普通は表示されない.これらのファイルは,主に利用環境の設定やコマンド実行時の初期化など特別な目的に使用され,この多くはホームディレクトリの下にある.このファイルの存在は,いつもは意識する必要がないので表示されないわけである.この名前のファイルの代表的なものには,前述した「.」と「..」の他に 「.bash_profile」,「.bashrc」 などがある.これらの使用目的などについては,関係する章で説明する.
このような「.」で始まるファイルを含めて表示するのが 「-a」 である.このとき 「-A」を指定すると,「.」と「..」は表示しない.
$ cd$ ls -a
. .. .bashrc .emacs a.out enshu jikken kuku.c $ ls -A
.bashrc .emacs a.out enshu jikken kuku.c
■ディレクトリの作成と消去 mkdir, rmdir
ファイルを上手に管理するにはディレクトリの利用が便利であることは前に述べた.ファイルを,使用目的や内容によって分類し,それぞれを別のディレクトリで管理するようにしよう.このとき,ディレクトリの階層は一層だけでなく,目的に応じて数層になるかも知れない.このためのコマンドに,ディレクトリを作成する mkdir (make a directory) コマンドと,不要になったディレクトリを消去する rmdir (remove a directory) コマンドがある.
図 3.2 では,ホームディレクトリに二つのディレクトリ (「enshu」 と 「jikken」) があるが,これらは次のコマンドで作成した.
$ pwd/home/cs9000 $ mkdir enshu
$ mkdir jikken
![]()
不要になったディレクトリの削除は次のようにすればよい.例えば,ディレクトリ「jikken」 を削除するのには,
$ rmdir jikken![]()
とする.ただし,ディレクトリの下にファイルがあるときには(ただし,「.」と「..」は除く),ディレクトリを削除できない.これは,誤ってディレクトリを消してしまうことを防止している措置で,もし,空でないディレクトリを削除しようとすると,
$ rmdir jikkenrmdir: jikken: Directory not empty
というメッセージで警告してくれる.
UNIXには,ファイルを作成するコマンドは特に用意されていない.これは,エディタやシェルを使用すれば簡単にファイルを作成することができるからであり,それぞれ他章を参照してほしい.ここでは,既にあるファイルを扱うコマンドについて説明する.
■ファイルの内容を見る cat, more, less
テキストファイルであれば,その内容を見るのは簡単である.例えば,「kuku.c」 の内容を見るのには cat (concatenate and display) コマンドを使用すればよい.
$ cat kuku.c/* the multiplication table */ #include <stdio.h> int main() { int i, j; for (i = 1; i <= 9; i++) { for (j = 1; j <= 9; j++) { printf("%2d ", i*j); } printf("\n"); } return 0; }
逆に,テキストファイルでないファイルは,そのままでは見ることはできない.
テキストファイルとは,例えば,エディタを使用して作成した,プログラムのソースファイルやテキスト列を出力するコマンドの実行結果をファイルとして保存したもので,英数字や漢字から構成されるファイル *1である.
*1 英数字や漢字にはいろいろなコードがある.ここでは,英数字(1バイト文字,半角文字)は ascii コード,漢字(2バイト文字,全角文字)は EUC (Extented UNIX Code) の漢字コードを前提とする.例えば,英数字だけから構成されるファイルであっても,使用されているコードが EBCDIC のときは,テキストファイルとしては扱えないので注意が必要である.テキストファイルのほかに,例えば,コンパイルの結果作成されるファイル(オブジェクトファイルや実行形式ファイル---バイナリファイルともいう)があり,これは,ビット列が英数字や漢字のコードとして意味を持つものでなく,ビットそのものに意味があるようなファイルである.テキストファイルでないファイルの内容を,catで見ることはできないし,また,見ようとすると画面が乱れておかしくなることがあるので,くれぐれも注意してほしい.
さて,ファイルには一画面には表示できないものもある.このようなファイルの内容を表示するのに便利な more および less コマンドがあり,どちらもファイルの内容を一画面分毎に分割して表示する.一般形は,
$ more ファイル名![]()
であり,例えば,
$ more /usr/man/man1/more.1![]()
のように使用する.一画面分を表示すると,画面の最下行に
--More--(10%)のようなメッセージを表示して一時停止する.括弧内には,現在表示されている部分がファイル全体のどの位置に相当するのかがパーセントで示される.
次の一画面分を表示させるのにはスペースキーを押せばよい.
を押すと,一行分先に進む.表示を途中で中止するのは 「q」 または 「Q」 か 「
+C」である.このコマンドには,上記以外にもいろいろな機能が用意されている.「?」 を押すと使用できる機能が表示されるので,一度は見ておくとよい.
なお,lessはmoreの機能強化版と言ったところである.明らかに more と異なるのは,more ではコマンド実行後に一度表示したテキストが画面上に残るのに対し,less では画面から消えてきれいになること,less ではテキストを検索した場合,検索した文字列が強調され探しやすくなっていることである.詳しくは man で調べて欲しい.
■コピーを作る.名前を変える.場所を移す.cp, mv
作業を進めているときに,ファイルのコピーを作りたいことがある.例えば,課題のプログラムは一応完成したが,別のアルゴリズムでも試してみたいとか,出力形式を少し変更してみたいという場合である.このとき,完成したものはそのまま残しておきたい.このようなときによく使用されるのが cp (copy files) コマンドで,
$ cp コピー元のファイル名 コピー先のファイル名![]()
の形式で指定する.当然,このコマンドの実行直後では,二つのファイルの内容は同じである.コマンドを実行後,どちらかのファイルを目的に合うように変更すれば,もう一つの別のファイルはそのままの状態で残ることになる.
作成したファイルの名前を変更するのには mv (move or rename files) コマンドがある.指定方法は,
$ mv 元のファイル名 新しいファイル名![]()
で,例えば,図 3.2 の 「kuku.c」 を 「kuku81.p」 に変更するのには,
$ mv kuku.c kuku81.c![]()
とすればよい.また,このコマンドはファイルの移動にも使用できる.例えば,図 3.2 の 「kuku.c」 を 「enshu」 の下に移動したければ,
$ mv kuku.c enshu/kuku.c![]()
または
$ mv kuku.c enshu![]()
と指定すればよい.ここで,下の例のように,新しいファイル名としてディレクトリを指定したときには,指定されたディレクトリに同じ名前で移動されるので,ファイル名を省略することができる.cpコマンドでも,同様に,新しいファイル名のところへディレクトリを指定することもできる.
■ファイルの消去 rm
ファイルは簡単に作成することができるが,作成したファイルのすべてを保存しておく必要はないはずである.一時的に使用するために作成したファイルもあるだろうし,時間の経過とともに不必要になることもあるだろう.また,自分では作成した覚えがないのに,いつの間にかできてしまっているような場合(例えば,「core」 やエディタのバックアップファイルなど)もあるかも知れない.このようなファイルがあると,操作の誤りの原因につながり,うまく管理ができなくなってしまうことが多い.また,ディスクの無駄使いとなる.このようなファイルは消去して,自分のディレクトリの下のファイルはいつも整理してスッキリとさせておくことが大切である.
ファイルを消去するには rm (remove files or directory) コマンドを使用する.使用方法は,
$ rm 消去するファイル名![]()
で指定する.例えば,「a.out」 を消去するには,
$ rm a.out![]()
とすればよい. rm で消去したファイルを復活することはできないので,このコマンドは充分に注意して使用しなければならない.rm の実行のときに,注意を促してくれる方法として 「-i」オプションがあり,消去する前に確認を求めてくれる.例えば,
$ rm -i a.outrm: remove 'a.out'?
のように確認してくるので,消してもよいときには 「y[Enter]」 で,消さないときには 「n[Enter]」 で答えればよい(rm と入力したら常に「rm -i」を実行するように エリアスを設定することもできる).
さて,ディレクトリの消去の節で,ディレクトリの下にファイルがあるときはディレクトリを削除できないことを述べた.ディレクトリも含めてそのディレクトリにあるファイル全部を消去するための基本操作は次のようにすればよい.
$ cd 消したいディレクトリのパス名(1) $ rm *
非常に危険なので要注意 (2) $ cd ..
(3) $ rmdir 消したいディレクトリのパス名
(4)
これは,(1) 消したいディレクトリに移動して,(2) そこにあるファイルを全部 *2 消去する.これで,ディレクトリは空になったので,(3)親ディレクトリに移動して,(4)ディレクトリを消すという操作である.「rm *」 は便利ではあるが,非常に危険なコマンドでもあるので使用するときは細心の注意が必要である.誤って消去してしまったファイルは復元できません.
*2 「*」 はワイルドカードと呼ばれ,全てのファイルを意味する.ただし,「.」で始まるファイル名は含まれないので,「.」で始まるファイル(「.」「..」は除く)があるときにはそのファイルも消去しておかなければならない.これらは普通 「.[a-z]*」か 「.[a-zA-Z]*」 で指定できる名前になっている.ワイルドカードについては 3.4.1節のファイル名の展開 を参照.rm コマンドには前述した機能を含むオプションが用意されている.前述の操作は,
$ cd 消したいディレクトリの親のパス名$ rm -r 消したいディレクトリ名
![]()
で行うことができるが,UNIXコマンドと操作に慣れるまでは前述の段階ごとの操作方法を使用することを勧める.
■課題 UNIX 基本コマンドの体験
- 下記の例を参考にコマンドを実行して,あなたのPC上のファイルシステムを探検してみなさい.
$ cd / $ pwd $ ls / $ ls $ cd usr $ pwd $ cd bin $ ls $ ls -l $ cd /usr/share $ pwd $ cd .. $ pwd $ cd $ pwd $ ls
- 自分のホームディレクトリに下記のようなディレクトリを作りなさい.
~/lib, ~/enshu, ~/jikken
- 自分のホームディレクトリにどんなファイルがあるかを ls -a,ls -l を使って調べなさい
- Emacs を使って例の kuku.c を作成しなさい.
Emacs は emacsとして起動する.
- これまでに作成したディレクトリおよびファイル kuku.c を使って,cat, mv, cp, rm, more, less の動作を確かめなさい.
【例】
$ cat kuku.c $ more kuku.c $ less kuku.c $ less .gnu-emacs (最初からホームディレクトリに入っている長いファイル) $ more .gnu-emacs $ cp kuku.c kuku2.c $ ls -l $ ls -ltF $ cat kuku.c kuku2.c $ cp kuku.c jikken $ ls jikken $ more jikken/kuku.c $ less kuku2.c $ ls $ rm kuku2.c $ ls