ディレクトリとパス名


目次

1 ディレクトリ

Windows におけるフォルダに相当するものを, UNIX ではディレクトリ (directory)またはディレクトリファイル (directory file)と呼びます 。 ディレクトリはファイルを格納する器です。 ディレクトリを利用することで,様々なファイルを,その用途別に分類して整理 することができます。

ディレクトリファイルという名称から予想できるとおり, ディレクトリもファイルの一種です。 これまでに扱ってきたファイルを「通常のファイル」と呼んで, ディレクトリではないことを明示することがあります。

1.1 ディレクトリ操作

まずディレクトリの作成や削除,ディレクトリ名変更の方法を学びましょう。 ファイルと同じくディレクトリにも名前(ディレクトリ名)が必要です。 ディレクトリ名の付け方はファイル名と同様です。

1.1.1 ディレクトリの作成 -- mkdir

ディレクトリを作成するには mkdir (make directories) コマンドを使います。 引数には作成するディレクトリの名前を指定します。

  1. tmpdir という名前のディレクトリを作成してください。
    mkdir tmpdir

  2. ディレクトリ tmpdir ができたかどうか確認します。

    ディレクトリもファイルの一種なので,ls コマンドで名前を表示できま す。ls を実行してください。

  3. 通常のファイルとディレクトリが同じように表示されるのは不便ですね 1。 両者を区別したいときには,ls にオプション -F を指定します。
    ls -F

    ディレクトリの場合にはディレクトリ名の後に / が付加されます。ただ し,この / はディレクトリであることを表す印であって,ディレクトリ 名の一部ではありません。

  4. ディレクトリに対して cat コマンドを実行したらどうなるでしょう。 cat tmpdir を試してみましょう。

    cat コマンドは,通常のファイルの内容を表示するコマンドであること を思い出しましょう。

1.1.2 ディレクトリ名の変更とディレクトリ削除 -- mv, rmdir

ディレクトリ名の変更には,ファイル名変更と同様に mv を使います。 ディレクトリの削除は rmdir (remove directories) です。

  1. mv tmpdir mydir を実行して,tmpdir の名前を mydir に変更し てください。 ls コマンドで結果を確認してください。

  2. mydir を削除します。rmdir mydir を実行してください。 結果を確認してください。

1.2 ホームディレクトリとカレントディレクトリ

1.2.1 ホームディレクトリ

UNIX で利用できるファイルやディレクトリは,必ずいずれかのディレクトリ内 にあります2。 これまでに幾つかのファイルを作成しましたが,それらはユーザー毎に予め用意 されたディレクトリ内に作成していたのです。そのディレクトリをユーザーの ホームディレクトリ (home directory) と呼びます。ホームディレクト リを記号 ~ で表すことがあります。


1.2.2 カレントディレクトリ

コマンド操作でファイルやディレクトリを扱うときに必要な概念として, カレントディレクトリ (current directory; current は「現在の」,「現行 の」という意味) 3 があります。カレントディレクトリは文 字通り,現在使っているディレクトリを意味する用語です。

例えば,ls を引数無しで実行して表示されるのは,カレントディレクトリに存 在するファイルの名前です。また,cp や mkdir 等のコマンドに ファイル名やディレクトリ名を与えると,コマンドが処理するのは カレントディレクトリ内のファイルやディレクトリとなります4

ユーザーがログインしたときのカレントディレクトリはホームディレクトリです。 これまで,ファイルやディレクトリがホームディレクトリに作成されたのはその ためです。

1.3 カレントディレクトリの変更 -- cd

ホームディレクトリ (~) 以外のディレクトリに存在するファイルやディ レクトリを,これまでと同様の方法で操作するには, カレントディレクトリの変更を行います。

カレントディレクトリを変更するコマンドは cd (change directory) です。cd の引数には変更先のディレクトリを指定します。引数を指定しなければ,ホーム ディレクトリがカレントディレクトリになります(ホームディレクトリに戻れま す)。

\includegraphics*{10_cd.eps}

以下では,上の図に示すように,ホームディレクトリ(~)に通常のファイ ル loc とディレクトリ tmp を作り,さらにディレクトリ tmp に通常の ファイル loc とディレクトリ tmpsub を作ります。次の点に留意してお きましょう。

それでは,自分が今どのディレクトリにいるのか(カレントディレクトリがどこ なのか)を常に意識しながら,次の操作をしてください。

  1. 通常のファイル loc をホームディレクトリに作ります。 loc の中身は Here is my home とします。
    echo Here is my home > loc
    正しくできたか,ls と cat で確認してください。

  2. mkdir コマンドを使って,ディレクトリ tmp をホームディレクトリ に作成します。
    mkdir tmp
    ls コマンドを使って結果を確認してください。

  3. カレントディレクトリをホームディレクトリから tmp に変更します。 (今後,単に「tmp に移動する」のように表現することがあります。)
    cd tmp
    何も表示されなければ成功です5

  4. ディレクトリ tmp の中のファイル名一覧を得るために ls を実行 してください。

    カレントディレクトリである tmp には,まだ何も作っていませんから, 何も表示されません。

  5. echo コマンドを使って,ディレクトリ tmp の中に loc という通 常のファイルを作ってください。ファイルの中身は Here is tmp としま す。正しくできたか確認してください。

  6. mkdir コマンドを使って,ディレクトリ tmp の中に tmpsub というディ レクトリを作ってください。結果を確認してください。

  7. ホームディレクトリに戻るために,引数無しで cd を実行してく ださい。

    ちゃんとホームに帰れましたか? ファイル loc の中身を確認してください。

  8. rmdir tmp を試してください。

    ディレクトリ tmp を削除できませんね。rmdir は中身が空のディレクト リを削除するコマンドだからです。

1.4 カレントディレクトリと親ディレクトリの操作

1.4.1 親ディレクトリと子ディレクトリ

前節で作成した,ホームディレクトリ (~) 内のディレクトリ/ファイルの 構造を再掲します。

\includegraphics*{10_parentdir.eps}

あるディレクトリの一つ上位のディレクトリを 親ディレクトリ (parent directory)と呼びます。 上の図では,tmpsub の親ディレクトリは tmp で あり,tmp の親ディレクトリは ~ です。 逆に,tmpsub を tmp の子ディレクトリ (child directory)またはサブディレクト リ (subdirectory)と呼びます。tmp は ~ の子ディレクトリです。

1.4.2 カレントディレクトリと親ディレクトリの指定法 -- ``.'' と ``..''

カレントディレクトリの子ディレクトリは「カレントディレクトリに存在するディ レクトリ」です。そのため,第 1.2.2 節で述べたとおり,ディレ クトリ名をそのままコマンドの引数として指定すれば,それがコマンドの処理対 象となります。

一方,カレントディレクトリ自身や「カレントディレクトリの親ディレ クトリ」は,カレントディレクトリに存在するディレクトリではありませんので, ディレクトリ名をコマンドの引数に与えても,コマンドの処理対象にはなりませ ん。これらをコマンドの引数にしたければ,次の記号を使います。

. (ドット)
: カレントディレクトリ自身
.. (ドット二つ)
: カレンディレクトリの親ディレクトリ

以下を順に実行して,このことを確認しましょう。

  1. ホームディレクトリで ls -F を実行して,カレントディレクトリ に,ディレクトリ tmp があることを確認しましょう。

  2. ls コマンドの引数にはディレクトリを指定することができます。 ls tmp を実行してください。 ls -F tmp も試してください。

    ls の引数にディレクトリを指定すると,ls はそのディレクトリ内のファ イル一覧を表示します6

  3. ls の引数として,カレントディレクトリを明示してみます。 ls .(ドット) と ls の結果と比べてください。

    ちゃんと同じになりますね。

  4. カレントディレクトリを上図の tmpsub に変更してください。

    tmpsub はカレントディレクトリに存在するディレクトリではないので, cd tmpsub だけではうまくいきません。まず tmp に移ってから, tmpsub に移りましょう。

  5. tmpsub (カレントディレクトリ)に存在するファイルを ls コマンドで調べましょう。

    tmpsub には何もありませんね。

  6. ls -a を実行しましょう。

    -a は . で始まるものを含めてファイル名を表示する ls のオプション だったことを思い出してください。

  7. ls に -F と -a の二つのオプションを付けて実行してみましょう。ls に複数のオプションを付けるときには,それらを -aF のようにまとめて 書くことができます。
    ls -aF
    カレントディレクトリ自身とその親ディレクトリの存在を確認できまし たか。

  8. カレントディレクトリを,親ディレクトリである tmp に変更します。

    まず,cd tmp を試しましょう。

    コマンドの引数には,カレントディレクトリに存在するファイル/ディ レクトリ名を指定するのでしたから,これではうまくいきません。

    そこで,親ディレクトリの記号 .. を使います。

    cd ..

    エラーメッセージは出ませんね。

  9. カレントディレクトリの内容を ls -aF で表示してみてください。 loc というファイルが存在するはずですから,ファイルの中を見て ください。

    今はちゃんと tmp にいますね。

    また,ls -aF の表示では .. も現われました。さらに親ディレクトリ (ホームディレクトリ) に移動するには .. を使うことができます。

    では .. を使ってホームディレクトリに戻りましょう。


1.5 ディレクトリ間のファイルの移動と複写

前回は, mv と cp の引数に二つのファイル名を与え,ファイル名の変更とファイルの複写を行いましたが, これらの最後の引数に既存のディレクトリ名 directory を指定すると,mv と cp は次のとおり動作します。

mv file directory filedirectory に移動する
cp file directory filedirectory に,同じ名前のファイルとして複写する
mv の場合,file としてディレクトリ名を与えれば, ディレクトリを別のディレクトリに移動することもできます。

以下を試しましょう。

  1. 準備
    1. cd コマンドを引数無しで実行して,カレントディレクトリを ホームディレクトリにしておきましょう。

    2. ホームディレクトリに通常のファイル now はありますか? 中身はどうなっていますか?

      ファイル now が無ければ date > now で作成してください。

    3. ディレクトリ tmp がホームディレクトリに存在することを ls -F で確認してください。

  2. ファイルの移動

    1. ファイル now をディレクトリ tmp に移動します。 mv now tmp を実行してください。

    2. ls を実行して,ホームディレクトリから now が無くなったこと を確認しましょう。

    3. ls tmp を実行して,ディレクトリ tmp に now が存在することを 確認しましょう。

    4. カレントディレクトリを tmp に変更してから,ファイル now の内容を 見てみましょう。now はディレクトリ tmp に移動できていますね。

  3. ファイルの複写
    1. ディレクトリ tmp のファイル now を親ディレクトリ(ホームディレク トリ)に複写します。 cp now .. を実行してください。

    2. ls を実行して, カレントディレクトリ (tmp) に now が残っていることを確認しましょう。

    3. ls .. を実行して,親ディレクトリ (ホームディレクトリ) にファ イル now ができ上がったことを確認しましょう。

    4. カレントディレクトリ (tmp) のファイル now の内容を見てみましょう。

    5. カレントディレクトリを親ディレクトリ (ホームディレクトリ) に変更 して,now の内容を見てみましょう。

      ディレクトリ tmp のファイル now は,ホームディレクトリに複写され ましたね。

以上,ファイルやディレクトリの最も基本的な操作法である,カレントディレク トリに存在するファイルの操作や,カレントディレクトリの親および子ディレク トリへのファイル複写や移動の方法について学びました。

カレントディレクトリがどこであるかに拘らず, 任意のディレクトリに存在するファイルを操作することもできます。 その方法は次章で学習します。

1.6 まとめ


1.6.1 用語

ディレクトリ:
ファイルを分類して格納するための器。 ディレクトリもファイルの一種である。

カレントディレクトリ:
現在使っているディレク トリ。コマンドの引数に与えるファイル名やディレクトリ名は,カ レントディレクトリのファイルやディレクトリを指す。コマンド行 において,カレントディレクトリを . (ドット) で指定で きる。

ホームディレクトリ:
各ユーザーが自分のファイルや ディレクトリを格納するためのディレクトリ。ログイン直後のカレ ントディレクトリはホームディレクトリである。記号 ~ で 表すことがある。

親ディレクトリ
あるディレクトリの一つ上位のディレクトリ。 コマンド行において,カレントディレクトリの親ディレクトリを .. (ドット二つ) で指定できる。

子ディレクトリ(サブディレクトリ)
あるディレクトリ(の直下)に存在するディレクトリ。


1.6.2 ファイル/ディレクトリ操作の主なコマンド一覧

コマンド 機能
ls [directory ...] カレントディレクトリ(または directory ...)に存在するファイルの名前を表示
ls -F [directory ...] ファイルの種類を表す記号を付加して,カレントディレクトリ(または directory ...)に存在するファイルの名前を表示
ls -a [directory ...] ドットで始まるファイルを含め,カレントディレクトリ(または directory ...)に存在するファイルの名前を表示
cd [directory] カレントディレクトリを directory に変更 (directory を省略した場合はホームディレクトリに変更)
mkdir directory ... directory ...の作成
rmdir directory ... 空のディレクトリ directory ... の削除
cat file ... file ... の内容を表示
cp file1 file2 file1file2 に複写
cp file ... directory file ...directory に複写
mv file1 file2 file1 の名前を file2 に変更
mv directory1 directory2 directory1 の名前を directory2 に変更
mv file ... directory file ...directory に移動
rm file ... file ... を削除
rm -r file ... file ... をディレクトリ階層を含めてすべて削除(誤操作に注意)
pwd カレントディレクトリ名を絶対パス名で表示
file ... は複数のファイルを指定できることを,[ ] は中の要素が省略可能である ことを表します。 ここには次章で紹介するコマンドも含んでいます。


1.7 問題(次章の準備)

  1. ホームディレクトリに存在する通常のファイルやディレクトリの名前一 覧を表示しましょう。

  2. その中でディレクトリはどれでしょう? ファイルの種類を表す記号 (ディ レクトリの場合は / ) がつくように,ファイルやディレクトリ名の一覧 を表示しましょう。

  3. 次の図に示すように,ホームディレクトリにディレクトリ unix を作成し, そこにディレクトリ misc を作成してください。 また,ホームディレクトリに存在するファイル loc を unix に移動し,その名前を temp に変更してください。
    \includegraphics{10_prep_pathname.eps}

2 パス名


2.1 ルートディレクトリとディレクトリ/ファイルの階層構造

以下を順に実行してみましょう。

  1. 引数無しで cd コマンドを実行し,カレントディレクトリをホームディ レクトリにしてください。

  2. カレントディレクトリ名を表示する pwd というコマンドを実行してみま しょう。

    / で区切られた文字列の一番右側に,自分のユーザー名 (ログイン名) が表示されていれば,ホームディレクトリにいます。 詳しくは第 2.2.1 節で説明します。

  3. ls -aF を実行して,ホームディレクトリに存在する全てのファイ ルとディレクトリを,ファイルの種類を表す印つきで表示しましょう。 表示が画面に納まらない場合,おまじないとして
    ls -aF | head
    を実行してください。.. (親ディレクトリ) がありますね。みな さんのホームディレクトリには,さらに上位のディレクトリが存在する のです。

  4. cd .. を繰り返し実行して,どんどん上位のディレクトリに移動 してみましょう。移動する毎に pwdls を実行して, 結果を観察しましょう。

    pwd の出力が / になったら,何度 cd .. を実行しても,pwd は / を出 力します。行き止まり。このディレクトリをルートディレクトリ (root directory)といいます。

UNIX では,ディレクトリやファイルから成る階層構造(木構造)がただ一つ存 在します。ルートディレクトリは階層構造に唯一存在する最上位 (根; root) の ディレクトリです。ルートディレクトリを記号 / (スラッシュ)で表し ます 7

1 は UNIX システムにおける ディレクトリやファイルの階層構造の一例です。 各ユーザーのホームディレクトリも,すべてこの階層構造内にあります。 図において \fbox{OOOO}\fbox{XXXX} は, 各々,ユーザー OOOO や XXXX のホームディレクトリです。

図 1: UNIX システムにおけるディレクトリ/ファイルの階層構造例
\includegraphics{10_dir_hier.eps}

2.2 パス名

階層構造におけるディレクトリやファイルの位置を表す名前をパス名 (pathname) といいます。パス名には絶対パス名 (absolute pathname) と 相対パス名 (relative pathname) の二種類があります。

ファイル名やディレクトリ名だけでは,カレントディレクトリのファイルやディ レクトリ しか操作できませんでしたが,パス名を利用することにより,システム内の任意 のディレクトリに存在するファイルやディレクトリを扱うことが可能になります。


表 1: 絶対パス名と相対パス名の対応
絶対パス名 相対パス名 備考
/home/OOOO . カレントディレクトリ
/home/OOOO/unix unix または ./unix
/home/OOOO/unix/temp unix/temp または ./unix/temp
/home/OOOO/unix/misc unix/misc または ./unix/misc
/home .. カレントディレクトリの親
/ ../.. カレントディレクトリの親の親
/home/XXXX ../XXXX カレントディレクトリの親の子
/var ../../var
/var/tmp ../../var/tmp


2.2.1 絶対パス名

絶対パス名は,ディレクトリやファイルの位置をルートディレクトリを基点として 表すものです。 絶対パス名は次のように構成されます。

ルートディレクトリ:
/

ルートディレクトリ以外:
ルートディレクトリを意味する / に続き, ルートディレクトリから当該ディレクトリやファイルまでの道筋 を / で区切りながら順に記す。

例えば, 図 1 におけるディレクトリ \fbox{OOOO} の絶対パス名は /home/OOOO であり,ファイル temp の絶対パス名は /home/OOOO/unix/temp です8

絶対パス名を用いれば,システム内のファイルやディレクトリを一意に表現でき ます。第 2.1節で使った pwd コマンドは,カレントディレクト リを絶対パス名で出力するコマンドです。

2.2.2 相対パス名

相対パス名は,カレントディレクトリとの相対的な関係によって,ディレクトリ やファイルの位置を表すものです9。 そのため,カレントディレクトリを変更すれば相対パス名も変わります。 相対パス名の書き方は次のとおりですが,絶対パスとの表記上の違いは, パス名の先頭に / を付けないことです。

カレントディレクトリの子孫の場合:
(図1では右側が子孫)

カレントディレクトリから当該ディレクトリまでの道筋を / で区 切りながら順に記す。ただし,カレントディレクトリ名自身は記さ ない。カレントディレクトリを意味する . (ドット) を明示して, ./ に続いて道筋を記述してもよい。

カレントディレクトリの子孫以外:

親ディレクトリを意味する .. (ドット二つ) を / で区切りながら 書き並べることにより,カレントディレクトリの祖先 (図1では左 側) を表現する。

さらに,その子孫であるディレクトリやファイルを表したい場合に は,引き続き当該ディレクトリやファイルまでの道筋を / で区切っ て書き並べる。

カレントディレクトリが図 1\fbox{OOOO}であるとします。 このとき,図 1におけるディレクトリやファイルのいくつか を,絶対パス名と相対パス名で表したのが表 1です。

2.3 パス名を用いたファイルやディレクトリの操作

ファイル名やディレクトリ名を引数とするコマンドでは,ファイル名やディレク トリ名に代えパス名を指定することができます。パス名には,絶対パス名と相対 パス名のどちらを利用しても構いません。

2.3.1 例題 -- カレントディレクトリの変更

以下を順に実行してください。カレントディレクトリを変更(別のディレクトリ に移る)する度に,pwd コマンドを実行してカレントディレクトリを確認してく ださい。

  1. まず,pwd コマンドでカレントディレクトリの絶対パス名を確認しましょ う。

  2. 絶対パス名を使ってルートディレクトリに移る

    cd /

  3. 絶対パス名を使ってディレクトリ /var/tmp に移る

    cd /var/tmp

  4. ホームディレクトリに移る (ここではパス名を使わずに,引数無しの cd で済ませます)

    cd

  5. 相対パス名を使って,ディレクトリ unix の子ディレクトリである misc に移る

    cd unix/misc

  6. 相対パス名を使ってホームディレクトリに移る

    cd ../..

2.3.2 例題 -- ファイル名の一覧表示やファイルの内容閲覧

  1. ルートディレクトリに存在するファイルの一覧

    ls /

  2. ディレクトリ /etc に存在するファイルの一覧

    ls /etc

  3. ディレクトリ /etc に存在するテキストファイル passwd の内容閲覧 10

    cat /etc/passwd

2.3.3 例題 -- ファイルの複写や移動

以下は,すべてホームディレクトリをカレントディレクトリとした状態で実行し てください。実行したら,ls コマンド等で結果を確認してください。 コマンドの第2引数に与えるファイルの種類(ファイルかディレクトリか)に注意してください (第 1.5 節参照)。

  1. ディレクトリ unix に存在するファイル temp をディレクトリ misc に複写
    (cp file directory の形式で cp を実行)

    cp unix/temp unix/misc

  2. ディレクトリ unix に存在するファイル temp をディレクトリ misc に, ファイル名 tempfile として複写 (misc に tempfile と いうディレクトリは存在しないとする)
    (cp file1 file2 の形式で cp を実行)

    cp unix/temp unix/misc/tempfile

  3. tempfile をカレントディレクトリに移動 (mv file directory の 形式で mv を実行)

    mv unix/misc/tempfile .(ドット)

2.3.4 まとめ -- コマンドに対するファイルとディレクトリの指定方法


3 問題

  1. ホームディレクトリに存在するファイルやディレクトリの名前を確認し てください。ホームディレクトリの tempfile を削除してください。

  2. ホームディレクトリに存在するディレクトリ tmp の名前を junk に変更 してください。

  3. ディレクトリ junk と,その中のすべてのファイルやディレクトリを削 除してください。 ディレクトリの削除には rmdir コマンドを使ってください。

  4. カレントディレクトリをホームディレクトリとしたままで,ディレクト リ unix の子ディレクトリである misc に存在するファイルの名前を確認 し,misc に存在する temp を削除しましょう。

  5. ディレクトリ /bin に存在するファイル true を,ホームディレクトリの 子ディレクトリ unix に複写しましょう。ただし,複写先でファイル名 が mytrue となるようにしてください。 この操作は cp コマンドを一回だけ実行して行ってください。

  6. 次の指示に従って,ファイルやディレクトリの操作を行ってください。

    1. ホームディレクトリに通常のファイル kokugo と sansu を作成してくだ さい。 ファイルの作成には echo コマンドと > を使います。 ファイル kokugo の内容は aiueo とし,sansu の内容は 1+1=2 としておきましょう。

    2. ホームディレクトリの kokugo と sansu を,次の図に示すとおりに移動してください。 (ディレクトリ unix 内には,この二つ以外にファイルやディレクトリがあっても構いません。)

      \includegraphics{10_mondai_a.eps}

    3. さらに次のようにしてください。 (できるだけ少ない手順で,ディレクトリ kyouka に二つのファイルを入れます。ただし,ディレクトリ unix に rensyu を残さないでください。)

      \includegraphics{10_mondai_b.eps}



脚注

... 通常のファイルとディレクトリが同じように表示されるのは不便ですね1
ファイルの種類を色で区別するように設定されていることもあります
... にあります2
ルートディレクトリという特別なディレクトリを除く。
... の」という意味)3
ワーキングディレクトリ (working directory) や作業ディレクトリと呼ぶこともあります。
... カレントディレクトリ内のファイルやディレクトリとなります4
カレ ントディレクトリ以外のファイル操作については後で学びます。
... 何も表示されなければ成功です5
カレントディレクトリ名がプ ロンプトに表示される設定になっていれば,プロンプトが変わります。
... イル一覧を表示します6
ls にオプション -d を指定すると, ディレクトリの内容ではなく,ディレクトリ自身を表示します。
... ます7
Windows ではドライブ毎にファイルの階層構造があり,ルートディレ クトリやカレントディレクトリもドライブ毎に存在しますが,UNIX にはドライ ブの概念はありません。また,Windows のコマンドプロンプトでは,ルートディ レクトリを =Y=で表します
... です8
Windows のパス名では / の代わりに =Y=を用います。 例えば, H ドライブのルートディレクトリの下の johokiki の絶対パス名は H:=Y=johokiki です。
... やファイルの位置を表すものです9
カレントディレクトリに限定せずに 「あるディレクトリからの相対的な位置を表す」と言うのが適切な場合もあります。
... の内容閲覧10
/etc/passwd は UNIX 機に登録されたユーザーの情報を保持しているファイルです。