| 3. ファイルとディレクトリ |
|---|
|
必修 |
|
発展 |
以下に説明するファイルとディレクトリを扱うための機構をファイルシステムといいます. ファイルシステムを理解し, 自由に扱うことができるようになれば, Unix (Linux) を使いこなす基礎はできたといってよいでしょう. まずはファイルシステムを構成するファイルとディレクトリの概念について学びましょう.
ファイルという言葉は, パソコンを使ったことがある人は一度は聞いたことがあるでしょう. ファイルは大まかに, 人間が読める「テキストファイル」, 機械が読める「バイナリ (2 進数で書かれた) ファイル」 の 2 つに分けられます. コンピュータにおけるファイルを一般的に定義すれば, 「ある目的のために, 関連性のある一定形式の情報を集めて, 記録媒体上に記録し名前をつけたもの」です. 私たちがコンピュータ上で情報を管理する際の最小単位であるとも言えるでしょう.
0 個以上のファイルをまとめるために使われるファイルの一種で, 「ディレクトリファイル」と呼ぶこともあります. Windows, Mac 等ではフォルダと呼ばれるものに相当します. その実体は含まれるファイル名の一覧を格納した"ファイル"です. ファイルをいれておく"箱"のようなものです.
複数のディレクトリで作られた階層構造は 図 2.1 (を逆さに見るべき) にあるように樹の枝が分かれていく様に例えられ ており, "ツリー構造"といいます. Unix (Linux) ではファイルはたった1つのツリー構造からなっており, 一番最初のディレクトリを "/" (ルートディレクトリ) とよびます. "/" はまさに樹の"根"に相当し, そこから全てのファイル (葉) に つながっていくわけです.

まとめると, Unix ではルートディレクトリを起点とした 1つのツリー構造を持つファイルシステムを採用しており, ディレクトリによる階層構造を用いることでファイルを管理しやすくしています.
みなさんが Unix を使って作業するとき, 実際はどこかのディレクトリの中で作業していることになります. 先にディレクトリは"箱"の様なものと表現しましたが, 作業をする空間という意味では"部屋"のようなものともいえます. 自分が今いるディレクトリがどこであるかということは Unix において非常に重要です.
ログインしたときは自分の「ホームディレクトリ」の中にいることになります. 「ホームディレクトリ」は自分のアカウント名がついたディレクトリで, あなたが自由に使うことができる領域です.
ディレクトリの中には「ホームディレクトリ」の他に 「ルートディレクトリ」といった特別な名前が付いているものがいくつかあります.
| 呼び方 | 意味 |
|---|---|
| ルートディレクトリ | Unix のディレクトリ構造の頂点に存在するディレクトリ. "/" (スラッシュ)で表す. |
| ホームディレクトリ | それぞれのユーザ専用のディレクトリ. "~" (チルダ, にょろ)で表す. |
| カレントディレクトリ | 現在ユーザが作業しているディレクトリ. pwd (Print current Working Directory) コマンドで表示される. |
| 親ディレクトリ | カレントディレクトリの 1 段上のディレクトリ. ".." (ドットドット)で表す. |
| 子ディレクトリ | カレントディレクトリの 1 段下のディレクトリ. |
| そのディレクトリ自身 | ディレクトリに含まれるファイルにはそのディレクトリ自身も含まれます. これは "." (ドット) 一文字で表されます. |
これより先, ところどころ "foo" (ふー) と "bar" (ばー) という文字列が登場すると思います. これらはよく "Foobar" とセットで呼ばれている, プログラマ業界で適当な名前をつけるときに使う文字列です. プログラミング言語等における「北大太郎」みたいなものです. より一般的にはメタ構文変数と呼ばれています. 日本だと "foo", "bar" ではなく "hoge", "hero" (ほげ, へろ) が使われる場合も多いです. 詳しくは Wikipedia の Foobar, または メタ構文変数 をみてください.
pwd は現在あなたが作業をしているディレクトリを表示します. コマンドを実行してみましょう.
$ pwd
/home/foo
|
< 現在の自分のカレントディレクトリを表示
> 現在の自分のカレントディレクトリ. fooの部分はログインした人のアカウント名
|
cd コマンドはカレントディレクトリを変えるコマンドです(Change Directory).
$ cd ~
$ pwd
/home/foo
$ cd ../
$ pwd
/home
$ cd
|
< ~ を使ってホームディレクトリに移動
< 現在のカレントディレクトリを表示
> 現在のカレントディレクトリ (自分のホーム)
< 親ディレクトリに移動
< 現在のカレントディレクトリを表示
> 現在のカレントディレクトリ (home ディレクトリ)
< "cd" コマンドのみ単体で使うと... さて, 今どこにいる? (pwd コマンドで確かめてみよう)
|
上の図のようなディレクトリ構造を計算機上で表示するコマンドとして tree コマンドがあります.
$ tree /home/
`-- matryo
`-- mkuriki
`-- tatsuya
`-- ***(自分のアカウント名など)
|
|
こんな表示が出てきましたか? その他, 上の表にあるディレクトリについても, tree コマンドで構造を確かめてみて下さい.
ディレクトリやファイルの指定の仕方には 2 通りあります. 「絶対パス」で指定するか「相対パス」で指定するかです.
|
例えば "/" (ルートディレクトリ)の下の "home" ディレクトリの下の "foo" ディレクトリの下の test.txt というファイルを 読みたいとしましょう. ここで現在自分は "/" (ルートディレクトリ) の下の "home" ディレクトリの下の "bar" ディレクトリ中にいるものとします. この場合, 以下の 2 通りの方法でファイルを指定することができます. なお, 先に説明したように, ディレクトリとディレクトリは "/" (スラッシュ)で区切ります. |
| 名前 | 意味 |
|---|---|
| 絶対パス | ディレクトリやファイルの位置を "/" (ルートディレクトリ) から見た
位置として記述する方法. 例えば /home/foo/test.txt |
| 相対パス | ディレクトリやファイルの位置をカレントディレクトリから見た位置として記述する方法. 例えば ../foo/test.txt |
| チルダ置換 | "~" を用いて指定する方法. 例えば ~foo/test.txt など |
実はこれまでの作業編で "相対/絶対パス" を使い分けていたのですが気づいていましたか?? ここでは, 意識して両者を使ってみましょう. この節では自分のアカウント名を仮に "foo" とします. また, 同席の相方のアカウント名を仮に"bar"とします.
$ cd ~
$ pwd
/home/foo
$ ls
$ echo "Hello World" > hello.txt
$ ls
hello.txt
$ cd /home/bar
$ pwd
/home/bar
$ ls
$ cat ../foo/hello.txt
Hello World
$ cat /home/foo/hello.txt
Hello World
|
< ホームディレクトリに移動
< カレントディレクトリを表示
> 現在のカレントディレクトリ
< カレントディレクトリにあるファイルを表示
> 今は何もない
< hello.txt というファイルを作成. "Hello World" と書き込む
< カレントディレクトリにあるファイルを表示
> 作成した hello.txt が存在する
< 同席の相方のホームディレクトリに移動
< 現在のカレントディレクトリを表示
> 現在のカレントディレクトリ
< カレントディレクトリにあるファイルを表示
> 今は何もない
< 相対パスで hello.txt を読む
> hello.txt に書かれている内容
< 絶対パスで hello.txt を読む
> hello.txt に書かれている内容
|
絶対パス, 相対パスの 2 通りの方法でファイルが読めましたか? 実際にはカレントディレクトリの位置と作業したいファイルの位置関係を 考えて相対/絶対パスをつかいわけることになります.
ls コマンドに -F オプションをつけるとディレクトリファイルには続けて "/" (スラッシュ) が表示され, 普通のファイルと区別することが可能です.
$ ls -F /
etc/ home/ ...
|
< "/" (ルートディレクトリ) 以下にあるファイルを表示.
> ディレクトリには末尾に "/" (スラッシュ) が入る
|
新たなディレクトリを作成する場合は mkdir コマンドを実行します. 引数として作成するディレクトリ名を指定します.
例えば /home/foo の下に "work" というディレクトリを作成するには, 以下のような方法があります. 今任意のディレクトリにいるとします.
$ mkdir /home/foo/work
$ ls -F /home/foo
work/
$ cd ~
$ mkdir ./work2
$ ls -F ./
work/ work2/
$ mkdir ~foo/work3
$ ls -F ~foo/
work/ work2/ work3/
|
< 絶対パスで自分のホームディレクトリに work ディレクトリを作成
< ディレクトリができたか確認
> 作成した "work" ディレクトリ
< ホームディレクトリへ移動
< 相対パスで work2 ディレクトリを作成
< ディレクトリができたか確認
> 作成した "work2" ディレクトリ
< "~" を用いたパスで work3 ディレクトリを作成
< ディレクトリができたか確認
> 作成した "work3" ディレクトリ
|
既に存在するディレクトリを削除する場合は rmdir コマンドもしくは rm コマンドを実行します. 引数として削除するディレクトリ名を指定します.
例えば /home/foo の下の "work" というディレクトリを削除するには, 以下のようにします. 但しカレントディレクトリは /home/foo とします. 尚, "work" ディレクトリの下に存在するファイルごと削除する場合, rm コマンドを実行します.
$ rmdir /home/foo/work
$ ls -F /home/foo
work2/ work3/
$ cd ~
$ rmdir work2
$ ls -F
work3/
$ rmdir ~foo/work3
$ ls -F ~foo/
$ mkdir work work2 work3
$ ls -F
work/ work2/ work3/
$ rm -r /home/foo/work
$ ls -F /home/foo
work2/ work3/
$ rm -r work2
$ ls -F
work3/
$ rm -r ~foo/work3
$ ls -F ~foo/
|
< 絶対パスでディレクトリの削除 (ディレクトリ内が空の場合)
< 確認
> work が削除されている
< ホームディレクトリへ移動
< 相対パスでディレクトリの削除 (ディレクトリ内が空の場合)
< 確認
> work2 が削除されている
< "~"を用いてディレクトリの削除 (ディレクトリ内が空の場合)
< 確認
> work3 が削除されている
< work ディレクトリ再作成(mkdir はいっぺんに複数のディレクトリを作ることも可能)
< 確認
> work, work2, work3 が作成されている
< 絶対パスでディレクトリの削除 (ディレクトリ内のファイルごと削除する場合)
< 確認
> work が削除されている
< 相対パスでディレクトリの削除 (ディレクトリ内のファイルごと削除する場合)
< 確認
> work2 が削除されている
< "~"を用いてディレクトリの削除 (ディレクトリ内のファイルごと削除する場合)
< 確認
> work3 が削除されている
|
既に実行してもらっていますが, サイズの小さなファイルを作成する簡単な方法として echo コマンドを利用する方法があります.
$ cd ~
$ echo 'hogehoge' > test.txt
$ ls
test.txt
|
< ホームディレクトリに移動
< 文字列 'hogehoge' を test.txt というファイルに入れる
< 確認
> test.txt が作成されている
|
長めの文章やプログラムを作成する場合はエディタと呼ばれる プログラム(vi, nano, mule, emacs, ae, ex などなど)を使いますが, 今日は説明しません.
既存ファイルの他のファイルへのコピーは cp コマンドを用います.
$ cd ~
$ cp test.txt hoge.txt
$ ls
test.txt hoge.txt
$ cat hoge.txt
hogehoge
|
< ホームディレクトリに移動
< 先程作成した test.txt というファイルを hoge.txt というファイルにコピー
< 確認
> hoge.txt が作成されている
< hoge.txt の内容を出力させる
> hogehoge と出力されたかな?
|
既存ファイル名の変更は mv コマンドを用います.
$ cd ~
$ echo 'herohero' >> test.txt
$ ls
test.txt
$ cat test.txt
$ mv test.txt hero.txt
$ ls
hero.txt
$ cat hero.txt
|
< ホームディレクトリに移動
< ">>" と2度大なり記号を続けて入力する
< 確認
> test.txt は残っている
< test.txt の内容を確認.
> どう変わったでしょうか? (ここではわざと結果を表記していない)
< test.txt というファイルを hero.txt という名のファイルに変更
< 確認
> test.txt がなくなり hero.txt が存在する
< hero.txt の内容を出力させる
> test.txt と内容が同じになったでしょうか? (ここではわざと結果を表記していない)
|
ファイルの削除は rm コマンドを用います. 一度消したファイルは復帰できません.
$ cd ~
$ rm hero.txt
$ ls
|
< ホームディレクトリに移動. < 先程作成した hero.txt を消去する. < 確認 > hero.txt は無くなったかな? |
| 最終更新日: 2022/04/26(和氣光一) | copyright © 2000-2022 inex |