前節までに、ファイルの作成、一覧表示、コピー、削除、ファイル名の変更などの方法を説明しました。しかし、これらのファイルがどこに存在するのかという大きな問題が残っています。この節では、ディレクトリ階層について説明します。以下の解説をよく読んで、各節で示す例を実行してみてください。
ファイルはディレクトリにまとめられますが、ディレクトリ自体も階層構造になっています。この階層の最上位は「ルート」ディレクトリと呼ばれ、「/」で表されます。
次の図 3-1 の例で示すように、ファイルシステム内の各ディレクトリは、その中に多数のサブディレクトリを持つことができます。表記上は、ディレクトリのレベルを「/」文字で識別します。この点を考慮して、/ (ルート) ディレクトリには、/usr、/bin、/home、/lib というサブディレクトリがあることに注意してください。さらに /home サブディレクトリには、user1、user2、user3 というサブディレクトリがあります。
ディレクトリ (およびその中のファイル) を指定する場合、それが存在するディレクトリの名前も含めます。これをパス名と呼びます。たとえば、図 3-1 の user3 ディレクトリのパス名は、/home/user3 です。
同一ディレクトリ内のすべてのサブディレクトリとファイルの名前は一意でなければなりませんが、ディレクトリが異なればこれらの名前が同じであってもかまいません。たとえば、/usr ディレクトリには /usr/lib というサブディレクトリがあります。/usr/lib と /lib とではパス名が異なるため、これらの名前は互いに矛盾しません。
ファイルのパス名の機能は、ディレクトリのパス名とまったく同じです。ファイルのパス名は、ファイルシステム階層におけるそのファイルの位置を表します。たとえば、/home/user2 ディレクトリに report5 というファイルがあるとすると、そのファイルのパス名は /home/user2/report5 となります。このパス名は、ファイル report5 はディレクトリ user2 の中にあり、user2 はディレクトリ home の中にあり、home はルート (/) ディレクトリの中にあることを示しています。
ディレクトリの中には、サブディレクトリだけ、ファイルだけ、またはその両方を格納できます。
pwd (print working directory) コマンドは、ファイルシステム階層内でのユーザの現在位置を表示します。
$ pwd /home/user1 |
実際のディレクトリ構造が異なる場合は、pwd の出力結果が上記の例とは異なるものになります。作業用ディレクトリがファイルシステム階層内でのユーザの現在位置になることに注意してください。
各ユーザはホームディレクトリを持っています。OpenWindows 環境でシェルツールやコマンドツールのウィンドウを開いたときは、最初の位置 (作業用ディレクトリ) がホームディレクトリになります。ホームディレクトリは、アカウントの作成時にシステム管理者によって各ユーザに割り当てられます。
cd (change directory) コマンドを使うと、ファイルシステム階層内を自由に移動できます。
$ cd /usr/lib $ pwd /usr/lib |
cd コマンドを引数なしで入力すると、自分のホームディレクトリに戻ります。たとえば、ホームディレクトリが /home/user1 の場合は、次のようになります。
$ cd $ pwd /home/user1 |
C シェルでは、ホームディレクトリを表す短縮名としてチルド文字 (‾) が使われます。たとえば、次のように入力するとホームディレクトリ内の music サブディレクトリに移動できます。
example% cd ‾/music |
この短縮名を使って他のユーザのホームディレクトリを指定することもできます。次の例を参照してください。
example% cd ‾username |
username は他のユーザのログイン名です。このコマンドによって、そのユーザのホームディレクトリに移動します。
Bourne シェルを使っている場合は、この短縮名 ‾ は機能しません。
Bourne シェルを使っているときは、$home
と入力するとホームディレクトリに移動できるようにシステム管理者がシステムを構成している場合があります。その場合は、次のように入力すると、ホームディレクトリ内の music サブディレクトリに移動できます。
$ $home/music |
同様に、次のように入力すると、指定したユーザのホームディレクトリに移動できます。
$ $homeusername |
username は他のユーザのログイン名です。
サブディレクトリのすぐ「上」のディレクトリは、親ディレクトリと呼ばれます。前記の例では、/home が /home/user1 の親ディレクトリです。親ディレクトリは、シンボル .. (ピリオドを 2 つ) で表します。したがって、cd .. というコマンドを入力すると、次の例で示すように、作業用ディレクトリが親ディレクトリに変わります。
$ pwd /home/user1 $ cd .. $ pwd /home |
現在の作業用ディレクトリが /home/user1 のときに /home/user2 にあるファイルを操作したい場合は、次のような短縮名を利用すると便利です。
$ pwd /home/user1 $ cd ../user2 $ pwd /home/user2 |
../user2 は、user2 の親ディレクトリを経由するようシステムに指示します。この例に示すように、フルパス名 /home/user2 を入力するより簡単です。
mkdir コマンドの後に新しいディレクトリの名前を指定するだけで、新規ディレクトリを簡単に作成できます。
$ mkdir veggies $ cd veggies $ mkdir broccoli $ cd broccoli $ pwd /home/user2/veggies/broccoli |
ファイルやディレクトリのフルパス名はスラッシュ (/) で始まり、そのファイルまたはディレクトリとルートディレクトリとの間のディレクトリ構造全体を表します。ただし、現在の作業用ディレクトリに対するファイルやディレクトリの相対関係を表す省略名 (相対パス名) を使うこともできます。
親ディレクトリにいる場合は、フルパス名ではなくディレクトリ名だけを指定すればサブディレクトリに移動できます。前記の例では、cd veggies というコマンドで veggies ディレクトリの相対パス名が使われています。現在の作業用ディレクトリが /home/user2 の場合、このディレクトリのフルパス名は /home/user2/veggies となります。
別個のサブディレクトリをいくつか作成し、そのディレクトリ構造の中を移動してみてください。移動の際にはフルパス名と相対パス名の両方を使ってみてください。現在位置は pwd コマンドで確認します。
ディレクトリを別の名前に置き換えることによって、ディレクトリ名を変更できます。ディレクトリ名の変更には mv コマンドを使います。
$ pwd /home/user2/veggies $ ls broccoli $ mv broccoli carrots $ ls carrots |
mv コマンドを使って、ディレクトリをすでにある別のディレクトリ内に移動することもできます。
$ pwd /home/user2/veggies $ ls carrots $ mv carrots ../veggies2 $ ls ../veggies2 carrots |
この例では、mv コマンドを使って、carrots ディレクトリを veggies から veggies2 に移動しています。
ディレクトリとその下にあるファイルをコピーする場合は、cp -r コマンドを使います。
$ cp -r veggies veggies3 $ |
このコマンドは、veggies ディレクトリに含まれるすべてのファイルとサブディレクトリを、新しいディレクトリ veggies3 にコピーします。これは「再帰的コピー」と呼ばれ、-r (recursive) オプションで指定します。このオプションを指定しないでディレクトリをコピーしようとすると、エラーメッセージが出されます。
空のディレクトリを削除する場合は、rmdir コマンドを使います。
$ rmdir veggies3 $ |
ディレクトリにファイルやサブディレクトリが含まれている場合、rmdir コマンドではディレクトリは削除できません。
ディレクトリとその内容 (すべてのサブディレクトリやその中のファイルも含む) を削除する場合は、次に示すように rm -r (再帰的削除を指示する -r オプションを rm コマンドに付加したもの) を使います。
$ rm -r veggies3 $ |
rmdir コマンドで削除したディレクトリは復元できません。rm -r コマンドで削除したディレクトリとその内容についても同様に復元できません。