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

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

{{toc}}

((<"スケジュール表・各回資料 (08/09)"|[Exp2017]スケジュール表・各回資料#08-2F09>))

= 実習の前準備

((<実習の前準備|"[Exp2017]ファイルとディレクトリ, パーミッション実習事前準備">))を行ってください.

= 本日の実習概要

本日は以下の作業を行います.

* ((<ファイルとディレクトリ|[Exp2017]ファイルとディレクトリ#ファイルとディレクトリ>))

  * ディレクトリツリーを眺める

  * ディレクトリ間を移動する

  * ファイル/ディレクトリを作成・削除する

* ((<ファイルモードとリンク|[Exp2017]ファイルのモード#ファイルモードとリンク>))

  * 他人に見られないファイルの作成
  * 誤って消せないファイルの作成
  * リンクについて (時間がなければ自習)

== 注意事項

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

  * 例:

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


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

== 本節の目的

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

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

以下に説明するファイルとディレクトリを扱うための機構をファイルシステムと呼びます.
ファイルシステムの詳細については 08/08 の 「Linux のインストール」の回に説明しました.

=== ファイル

コンピュータにおけるファイルを一般的に定義すれば, 「任意のデータ (デジタル化された情報) を, 記録媒体上に記録し名前をつけたもの (出典 : 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 ファイルの内容を出力してみましょう.

=== tree コマンド

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

$ tree -L 1 /home/
/home/
|-- userA
|-- userB
|-- ***(自分のアカウント名)
`-- userC

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

コマンドがないと言われる場合は次のコマンドで tree コマンドをインストールしてから上記のコマンドを実行してください.

$ sudo apt-get install tree

では,

$ tree -L 1 /etc/ | less

とやってみて下さい. 先ほど紹介した, /etc/passwd, /etc/shadow が見つかりますか?

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

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

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

== ディレクトリ操作

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

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

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 コマンドを実行すると, どうなりますか?

== ファイル操作

=== ちょっとしたファイル作成方法

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

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

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

=== ファイルのコピー方法

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

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

hogehoge と出力されれば, test.txt の中身がコピーされていることが確認されたことになります.

=== ファイル名の変更方法

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

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

* 問題:

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

=== ファイルの削除方法

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

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

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

((<次の実習ページへ|[Exp2017]ファイルのモード>))

= 参考資料

このページは
((<"北海道大学 理学院 情報実験 (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>))
を基に作成しました.

((<"スケジュール表・各回資料 (08/07)"|[Exp2017](08/09)"|[Exp2017]スケジュール表・各回資料#08-2F09>))