4    ディレクトリの管理

この章では,システムでディレクトリを管理する方法を説明します。 この章を理解すると,次の操作が可能になります。

この章の例に従って実際に操作してみることにより,ディレクトリの管理について理解することができます。

例を実行するためには,まずログインする必要があります。 また,ログイン・ディレクトリに次のファイルおよびディレクトリが存在している必要があります。

上記の名前とは異なるファイル名を使用している場合には,この章の例を実行する際に適当に置き換えてください。 現在のディレクトリ内にあるファイルのリストを表示する場合は,第 3 章で説明した ls コマンドに,表 3-1 にある -R および -F フラグを指定して使用します。 画面は次のようになります。

$ ls -RF
file1     file2     file3     project/  record1   record6
reports/
 
./project:
 
./reports:
file1   file2   file3   notes
$ 

4.1    ディレクトリの作成 (mkdir コマンド)

ディレクトリを使用すると,個々のファイルを利用しやすいグループに編成することができます。 たとえば,レポートのすべての項目を reports ディレクトリに保管したり, 費用見積もりに関するデータおよびプログラムを estimate ディレクトリに保管することができます。 各ディレクトリにはファイルおよびディレクトリを含むことができます。

システム管理者がユーザのアカウントを設定する際に,ログイン・ディレクトリは必ず作成します。 しかし,システムで作業するうちに,作成あるいは編集したファイルを編成するための新たなディレクトリが必要になります。 新しいディレクトリは mkdir (make directory) コマンドを使用して作成します。

mkdir コマンドの構文は次のとおりです。

mkdir dirname

dirname 変数には新しいディレクトリ名を指定します。

システムはユーザの作業ディレクトリのサブディレクトリとして dirname ディレクトリを作成します。 つまり,新しいディレクトリを現在のディレクトリの 1 レベル下に作成します。

次の例では,cd コマンドを入力してログイン・ディレクトリに戻り,project2 ディレクトリを作成します。

$ cd
$ mkdir project2
$
 

ここで,相対パス名を入力して,reports ディレクトリ内にサブディレクトリを作成します。

$ mkdir reports/status
$
 

図 4-1 に現在のファイル・システムのツリー構造を示します。 projectproject2,および reports ディレクトリは,ログイン・ディレクトリより 1 レベル下位に位置しており, status ディレクトリは reports ディレクトリより 1 レベル下位に位置しています。

図 4-1:  ディレクトリとサブディレクトリとの関係

ファイル名と同じように,ディレクトリ名の最大長はシステムで使用しているファイル・システムによって異なります。 たとえば,255 バイト (省略時の値) の最大長が許されるファイル・システムもあれば,14 バイトの最大長しか許されないファイル・システムもあります。

ディレクトリに意味のある名前を付けるためには,ディレクトリ名の最大長を知っておくことが必要です。 詳細はシステム管理者に問い合わせてください。

オペレーティング・システムにはファイル名とディレクトリ名とを区別するための記号や表記はありませんので, ファイルとディレクトリを区別するためにユーザ独自の命名規則を定めるのも 1 つの方法です。

ただし,ls -F コマンドを使用すれば,ディレクトリの内容を表示するときに,ファイルとディレクトリとを見分けることができます。 このコマンドについての詳細は,4.3 節を参照してください。

4.2    ディレクトリの変更 (cd コマンド)

cd (change directory) コマンドは,現在のディレクトリ (作業ディレクトリ) を変更するためのコマンドです。 適切なパス名を指定して cd を実行することにより,同一ファイル・システム内であれば,自由にディレクトリを移動することができます。

注意

cd コマンドで現在のディレクトリを変更するためには,そのディレクトリにアクセスする実行許可が必要です。 ディレクトリ許可については,第 5 章を参照してください。

cd コマンドの構文は次のとおりです。

cd pathname

pathname 変数には,現在のディレクトリとして設定するディレクトリの完全パス名あるいは相対パス名を指定します。

パス名を省略して cd を入力すると,ログイン・ディレクトリに移ります。

現在のディレクトリ名を確認するためには,pwd (print working directory) コマンドを入力します。 pwd コマンドについては第 2 章を参照してください。

4.2.1    現在のディレクトリの変更

次の例では, pwd コマンドを入力して作業ディレクトリの名前を表示した後,cd コマンドを使用して現在のディレクトリを変更します。

まず,パス名を指定しないで cd コマンドを入力し,ログイン・ディレクトリに戻ります。 次に,pwd コマンドを入力して,現在のディレクトリがログイン・ディレクトリであることを確認します。 /u/uname の表示は,使用しているシステムによって異なります。

$ cd
$ pwd
/u/uname
$
 

ここで,相対パス名 project2 を指定して cd コマンドを入力し,project2 ディレクトリに移ります。

$ cd project2
$
 

再び pwd コマンドを入力して, project2 が現在のディレクトリであることを確認します。 その後,cd コマンドを入力してログイン・ディレクトリに戻ります。

$ pwd
/u/uname/project2
$ cd
$
 

ファイル・システムのツリー構造において,別の分岐である status ディレクトリに現在のディレクトリを変更するためには, 完全パス名を指定して cd コマンドを入力します。

$ cd reports/status
$ pwd
/u/uname/reports/status
$
 

4.2.2    相対パス名の使用

相対パス名を使用すると,少ないキーストロークでディレクトリを変更することができます。 相対パス名には次のような記号を使用します。

すべてのディレクトリには,ドット (.) とドット・ドット (..) で表現される 2 つエントリが必ず含まれています。 これらのエントリは現在のディレクトリに対して相対的なディレクトリを参照します。

ドット (.)

現在のディレクトリを参照する。

ドット・ドット (..)

現在のディレクトリの親ディレクトリを参照する。

親ディレクトリとは,ファイル・システムのツリー構造において,現在のディレクトリのすぐ上位に位置するディレクトリのことです。

. および .. エントリを含め,ピリオドで始まるファイルをリストする場合は, -a フラグを指定して ls コマンドを実行します。

次の例では,まずログイン・ディレクトリに移り,その後 reports ディレクトリに移っています。

$ cd
$ cd reports
$
 

ここで ls コマンドを実行すると,次のように reports ディレクトリに含まれるファイルおよび先程作成した status サブディレクトリが表示されます。

$ ls
file1   file2   file3   notes   status
$
 

ここで ls -a コマンドを実行すると, 上記のファイルおよびディレクトリに加えて,ドット (.) で始まる相対ディレクトリ名がリストされます。

$ ls -a
./   ../   file1   file2   file3   notes   status
$
 

相対ディレクトリ名 .. を使用すると,ファイル・システムのツリー構造において,現在のディレクトリより上位にあるファイルおよびディレクトリを参照することができます。 つまり親ディレクトリに移動したい場合は,親ディレクトリの完全パス名ではなく,相対ディレクトリ名を使用することができます。

次の例では,cd .. コマンドを使用して,現在のディレクトリを reports ディレクトリから,その親ディレクトリであるログイン・ディレクトリに変更しています。

$ pwd
/u/uname/reports
$ cd ..
$ pwd
/u/uname
$
 

ディレクトリ構造を上位に 2 レベル以上移動する場合は,相対ディレクトリ名を次の例のように使用することができます。 次の pwd コマンドに対する応答として表示されるスラッシュ (/) は,ルート・ディレクトリを表しています。

$ cd ../..
$ pwd
/
$
 

Korn または POSIX シェルおよび C シェルでは, ユーザのログイン・ディレクトリを指定するためにチルダ (~) を使用することができます。 たとえば,ユーザ自身のログイン・ディレクトリを指定する場合は,次のようにチルダを使用します。

$ cd ~
 

この例では,チルダ記号を使用することはキーストロークの節約とはなりません。 Tru64 UNIX オペレーティング・システムでは,cd を入力することにより,ファイル・システム内のどの場所からでもログイン・ディレクトリに移ることができるためです。 この機能はすべてのシェルで有効です。

ログイン・ディレクトリより下位のディレクトリにアクセスする場合は,チルダ記号を使用するとキーストロークの節約になります。 たとえば,ファイル・システム内の任意のディレクトリから reports ディレクトリへアクセスする場合は, 次のように入力します。

$ cd ~/reports
 

別のユーザのログイン・ディレクトリ,あるいはその下位ディレクトリまたはファイルにアクセスする場合も,チルダ記号は大変便利です。 他のユーザのログイン・ディレクトリの正確な位置を知らなくても,適切な許可を得ていれば,チルダ記号を使用することにより,最小限のキーストロークで移動することができます。

たとえば,次のように入力することにより,ファイル・システム内のどこからでも,ユーザ jones のログイン・ディレクトリに移動することができます。

$ cd ~jones
 

また,ユーザ jones のログイン・ディレクトリのすぐ下位にある status ディレクトリ内のファイルにアクセスする場合は,次のように入力します。

$ cd ~jones/status
 

4.2.3    シンボリック・リンクを介したディレクトリへのアクセス

ディレクトリがシンボリック・リンクで結びつけられているとき,cd コマンドで親ディレクトリにアクセスする場合は,cd コマンドに完全ディレクトリ名を指定するかあるいは相対ディレクトリ名を指定するかによって結果が異なります。 シンボリック・リンクしている親ディレクトリにアクセスする場合は,完全パス名を使用します。

たとえば,ユーザ user2 が,/u/user1/project へのシンボリック・リンクである /u/user2/project ディレクトリ上のファイルで作業している場合, 実際の親ディレクトリ (/u/user2) へ移動するためには,次のように入力します。

$ cd /u/user2
$ pwd
/u/user2
$
 

一方,相対ディレクトリ名 (..) を指定した場合は,シンボリック・リンクの親ディレクトリにアクセスすることになります。 たとえば,ユーザ user2 が,/u/user1/project へのシンボリック・リンクである /u/user2/project ディレクトリ上のファイルで作業をしている場合, cd .. コマンドを実行すると,次のような結果になります。

$ cd ..
$ pwd
/u/user1
$
 

ユーザ user2 は,/u/user2 ディレクトリではなく,/u/user1 ディレクトリに移動します。

シンボリック・リンクについての詳細は,3.4 節を参照してください。

4.3    ディレクトリの表示 (ls -F コマンド)

各ディレクトリにはサブディレクトリおよびファイルを含むことができます。 サブディレクトリを表示する場合は,ls -F コマンドを使用します。 このコマンドは現在のディレクトリの内容を表示するとき,ディレクトリに対しては後ろにスラッシュ ( / ) を付けて,ファイルと容易に識別できるようにします。

ls -F コマンドの構文は次のとおりです。

ls -F

次の例では,まずログイン・ディレクトリに戻り,ls -F コマンドを実行して,ディレクトリの内容を表示しています。 projectproject2reports の各ディレクトリにはスラッシュが付いています。

$ cd
$ ls -F
file1      file3      project2/  record6
file2      project/   record1    reports/
$
 

Korn または POSIX シェルおよび C シェルのユーザのなかには,ls コマンドの別名を定義して,ls を入力すると ls -F コマンドが実行されるように設定する人もいます。 別名の定義についての詳細は,第 8 章を参照してください。

4.4    ディレクトリのコピー (cp コマンド)

-r フラグを指定して cp コマンドを使用すると,ディレクトリおよびディレクトリ・ツリーをファイル・システムの別の場所に再帰的にコピーすることができます。

cp -r コマンドの構文は次のとおりです。

cp -r sourcedestination

source 変数にはコピーする元のディレクトリ名を指定します。 destination 変数にはコピー先ディレクトリを指定します。

図 4-2 は,次の例で cp -r コマンドがディレクトリ・ツリー reports をディレクトリ project にコピーする手順を示しています。 この例では,ログイン・ディレクトリからコマンドを入力すると仮定します。

$ cp -r reports project
$ 
 

図 4-2:  ディレクトリ・ツリーのコピー

reports サブディレクトリ内のファイル,file1file2file3notes に加えて,サブディレクトリ statusproject ディレクトリにコピーされます。

4.5    ディレクトリ名の変更 (mv コマンド)

ディレクトリが同じディスク・パーティションに含まれている場合に限り,mv コマンドを使用して,ディレクトリ名を変更することができます。

mv コマンドの構文は次のとおりです。

mv olddirectoryname newdirectoryname

olddirectoryname 変数には,移動または名前の変更を行いたいディレクトリの名前を指定します。 newdirectoryname 変数には,新しいディレクトリ名を指定します。

次の例では,まず reports ディレクトリに移り,ls -i -d コマンドを入力して,status ディレクトリのファイル通し番号をリストします。

$ cd reports
$ ls -i -d status
1091 status
$
 

ここで,mv コマンドを入力して,ディレクトリ名 statusnewstatus に変更します。 次に,newstatus ディレクトリのファイル通し番号をリストします。

$ mv status newstatus
$ ls -i -d newstatus
1091 newstatus
$
 

2 番目の ls -i -d コマンドでは,元のディレクトリ名 status がリストされません。 新しいディレクトリ newstatus がリストされ,status ディレクトリと同じファイル通し番号 (1091) が表示されています。

4.6    ディレクトリの削除 (rmdir コマンド)

ディレクトリが不要になった場合には,rmdir (remove directory) コマンドを使用して,不要なディレクトリをファイル・システムから削除することができます。 このコマンドで削除できるのは,ファイルおよびサブディレクトリを含まない空ディレクトリのみです。 ディレクトリからのファイルの削除については,4.6.4 項および3.9 節を参照してください。

rmdir コマンドの構文は次のとおりです。

rmdir dirname

dirname 変数には削除したいディレクトリの名前またはパス名を指定します。

次の各項の例を実行する前に,project2 ディレクトリに 3 つのサブディレクトリを作成しておきます。

まず,cd project2 コマンドを使用して,project2 を現在のディレクトリとして設定します。 次に,mkdir コマンドを使用して,scheduletasks および costs の各ディレクトリを作成します。 その後,project2 ディレクトリの内容をリストします。

$ cd project2
$ mkdir costs schedule tasks
$ ls -F
costs/  schedule/  tasks/
$
 

最後に,cd コマンドを使用してログイン・ディレクトリに戻ります。

$ cd
$ pwd
/u/uname
$
 

4.6.1    空ディレクトリの削除

rmdir コマンドは空ディレクトリだけを削除します。 ファイルやサブディレクトリを含むディレクトリを削除しようとすると,rmdir コマンドは次のようなエラー・メッセージを表示します。

$ rmdir project2
rmdir: project2 not empty
$
 

注意

あるディレクトリでユーザが作業しているとき,そのディレクトリを削除することはできません。 ディレクトリを削除するには,ディレクトリ・ツリーの他の位置に移動する必要があります。 詳細については4.6 節を参照してください。

ディレクトリ project2 を削除するためには,あらかじめそのディレクトリに含まれるファイルおよびディレクトリを削除しておかなければなりません。 次の例では,cd コマンドで project2 を現在のディレクトリに設定した後,ls -F コマンドで project2 の内容をリストします。

$ cd project2
$ ls -F
costs/  schedule/  tasks/
 

ここで,現在のディレクトリから schedule サブディレクトリを削除して,project2 ディレクトリの残りの内容をリストします。

$ rmdir schedule
$ ls -F
costs/  tasks/
$
 

project2 ディレクトリにはまだ 2 つのサブディレクトリ,costs および tasks が含まれています。 これらのディレクトリは,次の項で説明するパターン照合文字を使用して削除することができます。 これらのサブディレクトリが削除されれば,4.6 節で説明するように,project2 ディレクトリを削除することができます。

4.6.2    複数のディレクトリの削除

rmdir コマンドでパターン照合文字を使用すると,複数のディレクトリを一度に削除することができます。 パターン照合文字についての詳細は,第 2 章を参照してください。

ユーザが project2 ディレクトリで作業している場合,2 つのサブディレクトリ costs および tasks を削除するためには,rmdir *s?s コマンドを入力します。

$ rmdir *s?s
$ ls
$
 

lsコマンドを入力すると,project2 ディレクトリが空になったことを確認できます。

注意

rmdir コマンドにアスタリスク (*) だけを指定すると (rmdir *),現在のディレクトリからすべての空ディレクトリが削除されます。 パターン照合文字 * の使用に際しては,十分に注意してください。

4.6.3    現在のディレクトリの削除

現在のディレクトリで作業している間は,そのディレクトリを削除することはできません。 他のディレクトリに移ってから削除する必要があります。 通常は,cd .. コマンドを入力して,現在のディレクトリの親ディレクトリに移動してから,rmdir に削除したいディレクトリのパス名を指定して入力します。

project2 ディレクトリは空になっています。 project2 ディレクトリを削除するには,project2 の親ディレクトリであるログイン・ディレクトリに移動してから, rmdir dirname コマンドを実行します。 その後,ls を入力して,project2 ディレクトリが削除されていることを確認します。

$ cd
$ rmdir project2
$ ls
file1   file2   file3   project/  record1   record6   reports/
$
 

ログイン・ディレクトリから project2 ディレクトリが削除されています。

4.6.4    ファイルとディレクトリの同時削除 (rm -r コマンド)

rmdir コマンドで削除できるのはディレクトリだけで,ファイルを削除することはできません。 ただし,-r (recursive) フラグを指定して rm コマンドを使用すると,ファイルとディレクトリを同時に削除することができます。

rm -r コマンドは指定したディレクトリからファイルを削除した後に,ディレクトリ自体を削除します。 このコマンドでは,指定したディレクトリおよびその下のサブディレクトリが (中に入っているファイルを含めて) すべて削除されます。 このコマンドの使用に際しては注意が必要です。

rm -r コマンドの構文は次のとおりです。

rm -r pathname

pathname 変数には,削除したいディレクトリの完全パス名あるいは相対パス名を指定します。 パターン照合文字を使用して,ファイルを指定することもできます。

注意

-r フラグを使用する場合は,必ずその機能を理解してから使用してください。 たとえば,ログイン・ディレクトリから rm -r * コマンドを実行すると,ユーザがアクセスできるすべてのファイルおよびディレクトリが削除されます。 ユーザがスーパユーザ権限を持ち,ルート・ディレクトリにいる場合には,このコマンドはすべてのシステム・ファイルを削除します。 スーパユーザ権限についての詳細は,5.7 節を参照してください。

ファイルまたはディレクトリを削除するために rm -r コマンドを使用する場合は,次のように -i フラグを指定するとよいでしょう。

rm -ri pathname

この形式でコマンドを入力すると,システムは指定された要素を削除する前に,確認のためのプロンプトを表示します。 プロンプトに対して y (yes) あるいは n (no) と入力することによって,ファイルまたはディレクトリを実際に削除するかどうかを制御できます。 ただし,-ri オプションを使用すると,多くのプロンプトに対して応答しなければならない場合があります。