最低限 Unix / Linux [I]

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

必修

  1. アカウント作成とログイン, ログアウトの作法(2020年度は実施しません)
  2. Unix の代表的なコマンド
  3. ファイルとディレクトリ
  4. パーミッション

発展

  1. ユーザー情報に関するファイル
  2. ルートディレクトリにある主なディレクトリ
  3. パーミッション付録

[3.1] ファイルとディレクトリの概念

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

[3.1.1] ファイル

ファイルという言葉は, パソコンを使ったことがある人は一度は聞いたことがあるでしょう. ファイルは大まかに, 人間が読める「テキストファイル」, 機械が読める「バイナリ (2 進数で書かれた) ファイル」 の 2 つに分けられます. コンピュータにおけるファイルを一般的に定義すれば, 「ある目的のために, 関連性のある一定形式の情報を集めて, 記録媒体上に記録し名前をつけたもの」です. 私たちがコンピュータ上で情報を管理する際の最小単位であるとも言えるでしょう.

[3.1.2] ディレクトリ

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

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


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

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

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

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

ログインしたときは自分の「ホームディレクトリ」の中にいることになります. 「ホームディレクトリ」は自分のアカウント名がついたディレクトリで, あなたが自由に使うことができる領域です.

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

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


[コラム] "foo" と "bar"

これより先, ところどころ "foo" (ふー) と "bar" (ばー) という文字列が登場すると思います. これらはよく "Foobar" とセットで呼ばれている, プログラマ業界で適当な名前をつけるときに使う文字列です. プログラミング言語等における「北大太郎」みたいなものです. より一般的にはメタ構文変数と呼ばれています. 日本だと "foo", "bar" ではなく "hoge", "hero" (ほげ, へろ) が使われる場合も多いです. 詳しくは Wikipedia の Foobar, または メタ構文変数 をみてください.


作業編

pwd コマンド

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

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

cd コマンド

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

                $ cd ~
                $ pwd
                /home/foo

                $ cd ../               
                $ pwd       
                /home

                $ cd       
                              
                < ~ を使ってホームディレクトリに移動
                < 現在のカレントディレクトリを表示
                > 現在のカレントディレクトリ (自分のホーム)

                < 親ディレクトリに移動
                < 現在のカレントディレクトリを表示
                > 現在のカレントディレクトリ (home ディレクトリ)

                < "cd" コマンドのみ単体で使うと... さて, 今どこにいる? (pwd コマンドで確かめてみよう)
              

tree コマンド

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

                  $ tree /home/       
                  `-- matryo
                  `-- mkuriki
                  `-- tatsuya
                  `-- ***(自分のアカウント名など)
                
                

こんな表示が出てきましたか? その他, 上の表にあるディレクトリについても, tree コマンドで構造を確かめてみて下さい.

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

[3.2.1] 絶対パスと相対パス

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

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

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

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


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

実習編

実はこれまでの作業編で "相対/絶対パス" を使い分けていたのですが気づいていましたか?? ここでは, 意識して両者を使ってみましょう. この節では自分のアカウント名を仮に "foo" とします. また, 他人のアカウント名として仮に"bar"とします.2020年度は実際に"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 が存在する

                  < 別ユーザー"bar"のホームディレクトリに移動
                  < 現在のカレントディレクトリを表示
                  > 現在のカレントディレクトリ

                  < カレントディレクトリにあるファイルを表示 
                  > 今は何もない

                  < 相対パスで hello.txt を読む
                  > hello.txt に書かれている内容 

                  < 絶対パスで hello.txt を読む
                  > hello.txt に書かれている内容 
                

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


練習: /usr/local/ ディレクトリに移動し, そこから 相対パス, 絶対パスの 2 通りの指定方法で hello.txt ファイルの内容を cat コマンドを用いて出力してみましょう.

[3.3] ディレクトリの操作

[3.3.1] ディレクトリの表示方法

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

                    $ ls -F /       
                    etc/ home/ ...
                  
                    < "/" (ルートディレクトリ) 以下にあるファイルを表示. 
                    > ディレクトリには末尾に "/" (スラッシュ) が入る 
                  

[3.3.2] ディレクトリの作成方法

新たなディレクトリを作成する場合は 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" ディレクトリ 
                  

[3.3.3] ディレクトリの削除方法

既に存在するディレクトリを削除する場合は 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 が削除されている

                    

練習: ディレクトリ内にファイルが存在するとき rmdir コマンドを実行すると, どうなるか確認してみましょう

[3.4] ファイルの操作

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

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

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

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

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

既存ファイルの他のファイルへのコピーは 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 と出力されたかな? 
                        

練習: 間違って cp コマンドを用いて同じ名前で保存するとどうなるでしょう? たとえば cp hoge.txt hoge.txt と実行するとどうなるか確認してみましょう.

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

既存ファイル名の変更は 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 と内容が同じになったでしょうか? (ここではわざと結果を表記していない)
                          

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

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

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

$ cd ~
$ rm hero.txt
$ ls

                            
< ホームディレクトリに移動.
< 先程作成した hero.txt を消去する.
< 確認 
> hero.txt は無くなったかな?
                            
>> 次ページへ

情報実験第二回のページへ戻る

最終更新日: 2018/04/13(村橋究理基) copyright © 2000-2018 inex