IT pass HikiWiki - [itbase2021]ファイルとディレクトリ Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

{{toc}}


= 注意事項

* 以下のように, プロンプト "$" の後についているコマンドをみなさんに入力してもらいます. 次の行は出力結果です.

  * 例:

   $ pwd               <-- pwd が実際に打つコマンド      
   /home/<ログイン名>


= ファイルとディレクトリ

== 本節の目的

* ファイルとディレクトリの概念を学ぶ
* パスの指定方法を学ぶ (相対パス, 絶対パス)
* ファイル, ディレクトリの操作方法を学ぶ

== ファイルとディレクトリ

以下に説明するファイルとディレクトリを扱うための機構をファイルシステムと呼びます.

=== ファイル

コンピュータにおけるファイルを一般的に定義すれば, 「任意のデータ (デジタル化された情報) を, 記録媒体上に記録し名前をつけたもの (出典 : Wikipedia)」です. 私たちがコンピュータ上で情報を管理する際の最小単位であるとも言えるでしょう.

=== ディレクトリ

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

=== ディレクトリの階層構造

ディレクトリはファイルだけでなく, 別のディレクトリやファイルをいっしょに束ねることが可能です.

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

((<URL:https://itpass.scitec.kobe-u.ac.jp/~itpass/exp/fy2012/120518/practice/hiki-images/fig08050201.png>))

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

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

=== 作業編

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

$ pwd      
/home/foo          < "foo" の部分はログインした人のアカウント名です.

一番最初にある "/" は先の解説にあったディレクトリの起点であるルートディレクトリ ("/") を意味し, その後の "/" はディレクトリの境目を示しています. 意味するところは次にまとめて解説します.

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

$ ls /      

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

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

上記のディレクトリの内, 一般ユーザが使用できるのは基本的に /home/(ユーザ名)/ のディレクトリです.

== ディレクトリの呼び方

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

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

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

=== 特定のディレクトリの呼び方

# RT
呼び方, 意味
ルートディレクトリ, Unix のディレクトリ構造の頂点に存在するディレクトリ. "/" (スラッシュ) で表す.
ホームディレクトリ, それぞれのユーザ専用のディレクトリ. "~" ("チルダ" または "にょろ" と読む) で表す.
カレントディレクトリ*, 現在ユーザが作業しているディレクトリ. pwd (Print current Working Directory) コマンドで表示される.
親ディレクトリ, カレントディレクトリの 1 段上のディレクトリ. ".." (ドットドット) で表す
子ディレクトリ, カレントディレクトリの 1 段下のディレクトリ.

* ディレクトリに含まれるファイルにはそのディレクトリ自身も含まれ, カレントディレクトリは "." (ドット) 一文字で表される.

=== 作業編

ls コマンドは, ある指定したディレクトリの中にどんなディレクトリやファイルが入っているのかを調べるコマンドです (list directory contents). このコマンドを使って, 今いるディレクトリにカレントディレクトリを表すディレクトリ "." と, 親ディレクトリを表すディレクトリ ".." が存在することを確かめましょう.

$ ls -a             < "-a" は ls のオプションで, ディレクトリ内に存在する全てのファイルを表示します.
.                   < これがカレントディレクトリ自身を表すディレクトリ
..                  < これが親ディレクトリを表すディレクトリ
その他のファイル    < そのほかに入っている雑多なファイルが続く

という感じです. カレントディレクトリ内に, 自身を表すディレクトリと親ディレクトリを表すディレクトリが確かに存在するということがわかりました.

cd コマンドはカレントディレクトリを変えるコマンドです (Change Directory). 以下でディレクトリを移動してみましょう.

$ cd ~              
$ pwd               < 現在のカレントディレクトリを表示
$ cd ../            
$ pwd               < 現在のカレントディレクトリを表示
$ cd ./             < さて, 今どこにいる??

なぜそうなるのかを, 上のコマンドの順番を追って考えてみましょう. (答えは端末で "pwd" と打てば表示されます)

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

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

図 2 のようなディレクトリ構造があるとしましょう.

((<URL:https://itpass.scitec.kobe-u.ac.jp/~itpass/exp/fy2012/120518/practice/hiki-images/fig08050202.png>))

図 2: ディレクトリ構造の例

たとえば / (ルートディレクトリ) の下の home ディレクトリの下の chikuwa2 ディレクトリの下の work ディレクトリの下の hoge.txt というファイルを指定したいとしましょう.

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

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

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

# RT
名前, 意味
絶対パス, ディレクトリやファイルの位置を / (ルートディレクトリ) から見た位置として記述する方法. 上記の例では "/home/chikuwa2/work/hoge.txt" . またホームディレクトリまではチルダを用いて省略できる. たとえば "~/work/hoge.txt"
相対パス, ディレクトリやファイルの位置をカレントディレクトリから見た位置として記述する方法. たとえば "../work/hoge.txt"

=== 作業編

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

$ cd ~                                 < ホームディレクトリに移動
                                          (自分のログイン名を仮に "foo" とします)
$ pwd                                  < カレントディレクトリを表示
$ echo 'Hello World!' > hello.txt      < hello.txt というファイルを作成し,
                                          "Hello World!" と書き込む
$ cd /home/bar                         < 担当実験機のTA (ログイン名を仮に
                                          "bar" とします) のホームディレクトリに移動
$ pwd                                  < 現在のカレントディレクトリを表示

$ cat ../foo/hello.txt                 < hello.txt の中身を表示
                                          (foo には自分のログイン名を入れる)
$ cat /home/foo/hello.txt              < hello.txt を中身を表示
                                          (foo には自分のログイン名を入れる)

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

* 問題:

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


== ディレクトリ操作

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

=== ディレクトリを表示する方法

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

$ ls -F /      

=== カレントディレクトリを表示する方法

pwd コマンドによって現在のカレントディレクトリを知ることができます (もうすでに何回かやりましたね).

$ pwd

=== ディレクトリを移動する方法

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

たとえば /home/foo から /home/bar に移動するには, 以下のような 3 通りの表現方法があります(foo は自分のログイン名, bar は相方のログイン名に置き換えてください) .

$ cd /home/bar        < 絶対パスを指定して, 相方のホームディレクトリに移動
$ cd ~                < foo (自分) のホームディレクトリに戻る
$ cd ~bar/            < ~ (チルダ) をつかって相方のホームディレクトリへ移動
$ cd ~
$ cd ../bar           < 相対パスで指定して, 相方のホームディレクトリに移動

=== ディレクトリを作成する方法

新たなディレクトリを作成する場合は mkdir コマンドを実行します. 引数として作成するディレクトリ名を指定します. 引数とは上で使用した例を用いれば
$ cd /home/bar
      ^^^^^^^^^この部分
のことです. コマンドの目的語にあたるものと言えるでしょう(詳しくは次週).

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

* 方法 1

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

* 方法 2

   $ cd  ~                       < ディレクトリを作りたい場所まで移動
   $ mkdir ./work                < 相対パスで指定

* 方法 3

   $ mkdir ~foo/work             < ~foo は foo のホームディレクトリの意味となる

=== ディレクトリを削除する方法

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

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

* work ディレクトリ内が空の場合

$ rmdir /home/foo/work        < 絶対パスで指定
$ rmdir work                  < 相対パスで指定
$ rmdir ~foo/work             < ~foo は foo のホームディレクトリを意味する

* work ディレクトリ内にファイルが存在し, ファイルごと削除する場合

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

* 問題:

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


= 参考資料

このページは
((<"北海道大学 理学院 情報実験 (INEX)"|URL:http://www.ep.sci.hokudai.ac.jp/~inex>))

((<" 最低限 UNIX / Linux [II] ファイルとディレクトリ (2007 年度資料)"|URL:http://www.ep.sci.hokudai.ac.jp/~inex/y2007/1019/1022.1.html>))
を基に作成しました.