最低限 UNIX / Linux [II]

  1. 実習の前準備
  2. ファイルとディレクトリ
  3. ファイルモードとリンクについて

2. ファイルとディレクトリ

[2.0] 本節の目的

  1. ファイルとディレクトリの概念を覚える.
  2. パスの指定方法を覚える(相対パス, 絶対パス)
  3. ファイル, ディレクトリの操作方法を覚える(pwd, mkdir, rm, rmdir, cp, mv)

[2.1] ファイルとディレクトリ

以下に説明するファイルとディレクトリを扱うための機構をファイルシステムといいます. ファイルシステムを理解し, 自由に扱うことができるようになれば, UNIX / Linux を使いこなす基礎はできたといってよいでしょう.

ファイル
コンピュータにおけるファイルを一般的に定義すれば, 「ある目的のために, 関連性のある一定形式の情報を集めて, 記録媒体上に記録し名前をつけたもの」です. 私たちがコンピュータ上で情報を管理する際の最小単位であるとも言えるでしょう.

ディレクトリ
零個以上のファイルをまとめるために使われるファイルの一種で, 「ディレクトリファイル」と呼ぶこともあります. Windows, Mac 等ではフォルダと呼ばれるものに相当します. その実体は含まれるファイル名の一覧を格納した"ファイル"です. ファイルをいれておく"容器"のようなものと考えれば良いでしょう.

ディレクトリの階層構造

ディレクトリは更にディレクトリやファイルを束ねることが可能です. 現実世界で例えると, ある分類によって書類(ファイル)をいくつかの箱に分けて詰め, それらの箱をまとめる, より大きな箱に入れる…, という方法で書類を整理することを想像すれば分かりやすいでしょうか.

複数のディレクトリで作られた階層構造は 図 2.1 (を逆さに見るべき)にあるように樹の枝が分かれていく様に例えられ ており, "ツリー構造"といいます. UNIX (Linux) ではファイルはたった1つのツリー構造からなっており, 一番最初のディレクトリを "/" (ルートディレクトリ) とよびます. "/" はまさに樹の"根"に相当し, そこから全てのファイル(葉)に つながっていくわけです.


図2.1: ディレクトリツリー

まとめると, UNIX ではルートディレクトリを起点とした 1つのツリー構造を持つファイルシステムを採用しており, ディレクトリによる階層構造を用いることでファイルを管理しやすくしています.

[2.1.1] 作業編

pwd は現在あなたが作業をしているディレクトリを表示します. コマンドを実行してみましょう.

$ pwd       
/home/foo

< "foo" の部分はログインした人のアカウント名
一番最初にある"/"は先の解説にあったディレクトリの起点である ルートディレクトリ("/")を意味し, その後の"/"はディレクトリの 境目を示しています. 意味するところは次にまとめて解説します.

ルートディレクトリにあるファイルの一覧をみて見ましょう.

$ ls /       
< うまく表示できない場合はコマンド入力の約束を読むべし.

参考として "/" (ルートディレクトリ)にあるディレクトリの一覧を示します.

/ 直下に存在するディレクトリの役割
ディレクトリ名 意味
/root スーパーユーザー(root)のホームディレクトリ
/boot 起動時に読み込まれるカーネル等が置かれます.
/dev Linux では, ハードウェアもファイルとして扱われます. ここにはそれらのデバイスファイルがまとめられます.
/etc 各種の設定ファイルや, 起動時に実行されるスクリプト等が置かれます.
/home ユーザー毎のホームディレクトリが置かれます.
/lib /bin, /sbinなどが使う共有ライブラリが置かれます.
/mnt 一時的なマウント用ディレクトリです. デフォルトで, このディレクトリ内に FD と CD-ROM をマウントするディレクトリが作られています. (/mnt/cdrom /mnt/floppy)
/proc カーネルの動作情報を示す, 特殊なファイルが置かれます. それらのファイルは, 全てカーネルが作成する仮想ファイルで, カーネルの機能を制御する目的にも使われます. ハードディスク空間は一切消費しません.
/bin 各種のコマンドで, バイナリ形式の実行ファイルが置かれます.
/sbin システム管理用コマンドの実行ファイルが置かれます.
/tmp 一時的なファイルの保管場所(一定期間アクセスが無いと削除されます)
/usr カーネルソースを含め, 多くのソフトウェアがここに入ります.

上記のディレクトリの内, 一般ユーザが使用できるのは /home/(ユーザ名)/ のディレクトリで, それ以外はシステムが使う領域になっています.


[2.2] ディレクトリの呼び方

みなさんが UNIX を使って作業するとき, 実際はどこかのディレクトリの中で作業していることになります. 先にディレクトリは"箱"の様なものと表現しましたが, 作業をする空間という意味では"部屋"のようなものともいえます. 自分が今いるディレクトリがどこであるかということは UNIX において非常に重要です.

ログインしたときは自分の「ホームディレクトリ」の中にいることになります. 「ホームディレクトリ」は自分のアカウント名がついたディレクトリで, あなたが自由に使うことができる領域です(先の pwd コマンドの結果を思い出してください).

ディレクトリの中には「ホームディレクトリ」の他に 「ルートディレクトリ」といった特別な名前が付いているものがいくつかあります.

特定のディレクトリの呼び方
呼び方 意味
ルートディレクトリ UNIX のディレクトリ構造の頂点に存在するディレクトリ. "/" (スラッシュ)で表す.
ホームディレクトリ それぞれのユーザ専用のディレクトリ. "~" (チルダ, にょろ)で表す.
カレントディレクトリ 現在ユーザが作業しているディレクトリ. pwd (Print current Working Directory)コマンドで表示される.
親ディレクトリ カレントディレクトリの 1 段上のディレクトリ. ".." (ドットドット)で表す.
子ディレクトリ カレントディレクトリの 1 段下のディレクトリ.
そのディレクトリ自身 ディレクトリに含まれるファイルにはそのディレクトリ自身も含まれます. これは "." (ドット) 一文字で表されます.

[2.2.1] 作業編

cd コマンドはカレントディレクトリを変えるコマンドです(Change Directory).

$ cd ~
$ pwd
$ cd ../               
$ pwd       
$ cd       
< ~ を使ってホームディレクトリに移動
< 現在のカレントディレクトリを表示
< 親ディレクトリに移動.
< 現在のカレントディレクトリを表示
< さて, 今どこにいる??

[2.3] ディレクトリやファイルの指定の仕方

ディレクトリやファイルの指定の仕方には 2 通りあります. 「絶対パス」で指定するか「相対パス」で指定するかです.

例えば / (ルートディレクトリ)の下の home ディレクトリの下の sugiyama ディレクトリの下の work ディレクトリの下の jupiter.txt というファイルを 読みたいとしましょう.

ここで現在自分は "/" (ルートディレクトリ) の下の home ディレクトリの下の dongury ディレクトリ中にいるものとします.

この場合, 以下の 2 通りの方法でファイルを指定することができます. なお, 先に説明したように, ディレクトリとディレクトリは "/" (スラッシュ)で区切ります.


ディレクトリやファイルの指定の仕方
名前 意味
絶対パス ディレクトリやファイルの位置を / (ルートディレクトリ)から見た 位置として記述する方法.
例えば /home/sugiyama/work/jupiter.txt
相対パス ディレクトリやファイルの位置をカレントディレクトリ から見た位置として記述する方法.
例えば ../sugiyama/jupiter.txt
チルダ置換 ~ を用いて指定する方法.
例えば ~sugiyama/jupiter.txt など

[2.3.1] 作業編

実はこれまでの作業編で "相対/絶対パス" を使い分けていたのですが 気づいていましたか?? ここでは, 意識して両者を使ってみましょう.

$ cd ~
$ pwd
$ echo "hello World" > hello.txt

$ cd /home/bar
$ pwd

$ cat ../foo/hello.txt               
$ cat /home/foo/hello.txt       
< ホームディレクトリに移動(自分のアカウント名を仮に "foo" とします.)
< カレントディレクトリを表示
< hello.txt というファイルを作成. "Hello World" と書き込む

< 同席の相方(アカウント名を仮に"bar"とします)のホームディレクトリに移動.
< 現在のカレントディレクトリを表示

< hello.txt を読む (foo には自分のユーザ名を入れる)
< hello.txt を読む (foo には自分のユーザ名を入れる)

絶対パス, 相対パスの 2 通りの方法でファイルが読めましたか? 実際にはカレントディレクトリの位置と作業したいファイルの位置関係を 考えて相対/絶対パスをつかいわけることになります.


問題: /home/ ディレクトリに移動し, そこから 相対パス, 絶対パスの 2通りの方法で hello.txt ファイルの内容を出力してみましょう.

[2.3.2] tree コマンド

上の図のようなディレクトリ構造を計算機上で表示するコマンドとして tree コマンドがあります.

$ tree /home/       
`-- konijo
`-- michi
`-- yukiko
`-- ***(自分のアカウント名)

こんな表示が出てきましたか?

では,

$ tree /etc/ | less

とやってみて下さい. 先週の講義で紹介した, /etc/passwd, /etc/shadow が見つかりますか?

/etc/
....
|-- passwd
....
|-- shadow
....

/etc/ と less の間にある | はパイプと呼ばれる機能で, 次回に詳しく紹介します. 恐らく, 実行した結果は kterm の画面には収まりきらないと思います. そのときは, カーソルキーで上下させてください.

less を終えるには, "q" を押して下さい.

その他, 上の表にあるディレクトリについても, tree コマンドで構造を確かめてみて下さい.


[2.4] ディレクトリ操作

ディレクトリ操作に関係するコマンドを一通り使ってみましょう.

[2.4.0]ディレクトリを表示する方法

ls コマンドに -F オプションをつけるとディレクトリファイルには 続けて"/"(スラッシュ)が表示され 普通のファイルと区別することが可能です.

$ ls -F /       

[2.4.1]カレントディレクトリを表示する方法

pwd コマンドによって現在のカレントディレクトリを知ることができます.

[2.4.2]ディレクトリを移動する方法

cd コマンドの後に移動先のディレクトリ名を指定すると, 指定したディレクトリに 移動することができます. 移動先のディレクトリ名は絶対パス, 相対パスの どちらでもいいです.

例えば /home/bar から /home/foo に移動するには, 以下のような 3 通りの方法があります.

$ cd /home/bar
$ cd ~baz/
$ cd ../foo       
< 絶対パスを指定して, 相方のホームディレクトリに移動. (bar は相方のアカウント名)
< ~ (チルダ)をつかって T.A. のホームディレクトリへ移動. (baz は TA のアカウント名)
< 相対パスで指定して, 自分のホームディレクトリに移動. (foo は自分のアカウント名)

[2.4.3]ディレクトリを作成する方法

新たなディレクトリを作成する場合は mkdir コマンドを実行します. 引数として作成するディレクトリ名を指定します.

例えば /home/foo の下に work というディレクトリを作成するには, 以下のような方法があります. 今任意のディレクトリにいるとします.

$ mkdir /home/foo/work2

$ cd  ~
$ mkdir ./work

$ mkdir ~foo/work       
< 絶対パスで指定


< 相対パスで指定

< ~foo は foo のホームディレクトリの意味となる.

[2.4.4]ディレクトリを削除する方法

既に存在するディレクトリを削除する場合は rmdir コマンドもしくは rm コマンドを実行します. 引数として削除するディレクトリ名を指定します.

例えば /home/foo の下の work というディレクトリを削除するには, 以下のようにします. 但しカレントディレクトリは /home/foo とします. 尚, work ディレクトリの下に存在するファイルごと削除する場合, rm コマンドを実行します.

$ rmdir /home/foo/work
$ rmdir work
$ rmdir ~foo/work       

$ rm -r /home/foo/work
$ rm -r work
$ rm -r ~foo/work       
< 絶対パスで指定 (ディレクトリ内が空の場合)
< 相対パスで指定 (ディレクトリ内が空の場合)
< ~foo は foo のホームディレクトリを意味する.

< 絶対パスで指定 (ディレクトリ内のファイルごと削除する場合)
< 相対パスで指定 (ディレクトリ内のファイルごと削除する場合)
< ~foo は foo のホームディレクトリを意味する.

問題: 仮にディレクトリ内にファイルが存在するとき rmdir コマンドを実行すると, どうなりますか?

[2.5] ファイル操作

[2.5.1] ちょっとしたファイル作成方法

既に実行してもらっていますが, サイズの小さなファイルを作成する簡単な方法として echo コマンドを利用する方法があります.

$ cd ~
$ echo 'hogehoge' >  test.txt
< ホームディレクトリに移動.
< 文字列 'hogehoge' を test.txt というファイルに入れる. 

長めの文章やプログラムを作成する場合はエディターと呼ばれる プログラム(vi, mule, emacs, ae, ex などなど)を使いますが, 今日は説明しません.

[2.5.2] ファイルのコピー方法

既存ファイルの他のファイルへのコピーは cp コマンドを用います.

$ cd ~
$ cp test.txt  hoge.txt
$ cat hoge.txt       
< ホームディレクトリに移動.
< 先程作成した test.txt というファイルを hoge.txt というファイルにコピー.
< hoge.txt の内容を出力させる(hogehoge と出力されたかな?). 

[2.5.3] ファイル名の変更方法

既存ファイル名の変更は mv コマンドを用います.

$ cd ~
$ echo 'herohero' >> test.txt 
$ cat test.txt
$ mv test.txt  hero.txt
$ ls
$ cat hero.txt
< ホームディレクトリに移動.
< ">>" と2度大なり記号を続けて入力する. 
< test.txt の内容を確認.
< test.txt というファイルを hero.txt という名のファイルに変更.
< ファイルリストを出力. (test.txt は存在しないことを確認!)
< hero.txt の内容を出力させる. (test.txt と内容が同じことを確認!)

問題: 前節では echo 'hogehoge' の後は ">" と大なり記号は一つだけ入力しましたが, 今回は echo 'herohero' の後は ">>" と大なり記号が二つになりました. 大なり記号が一つのときと二つのときでは何が違うでしょうか.

[2.5.4] ファイルの削除方法

ファイルの削除は rm コマンドを用います. Windows とは異なり, 一度消したファイルは復帰できません.

$ cd ~
$ rm hero.txt
$ ls
< ホームディレクトリに移動.
< 先程作成した hero.txt と hoge.txt を消去する.
< ファイルリストを表示させ, 上記ファイルが無くなっていることを確認.

尚, hoge.txt は次の作業のために残しておいてください.




>> 次ページへ

最終更新日: 2007/10/19(岩堀智子) Copyright © 2005 inex