この章では,システムでディレクトリを管理する方法を説明します。 この章を理解すると,次の操作が可能になります。
ディレクトリの作成 (4.1 節)
ディレクトリの変更 (4.2 節)
ディレクトリの表示 (4.3 節)
ディレクトリのコピー (4.4 節)
ディレクトリ名の変更 (4.5 節)
ディレクトリの削除 (4.6 節)
この章の例に従って実際に操作してみることにより,ディレクトリの管理について理解することができます。
例を実行するためには,まずログインする必要があります。 また,ログイン・ディレクトリに次のファイルおよびディレクトリが存在している必要があります。
file1
,file2
,file3
,record1
,および
record6
の各ファイル
file1
,file2
,file3
,および
notes
ファイルを含む
reports
サブディレクトリ
ファイルを含まない
project
サブディレクトリ
上記の名前とは異なるファイル名を使用している場合には,この章の例を実行する際に適当に置き換えてください。
現在のディレクトリ内にあるファイルのリストを表示する場合は,第 3 章で説明した
ls
コマンドに,表 3-1
にある
-R
および
-F
フラグを指定して使用します。
画面は次のようになります。
$ ls -RF file1 file2 file3 project/ record1 record6 reports/ ./project: ./reports: file1 file2 file3 notes $
ディレクトリを使用すると,個々のファイルを利用しやすいグループに編成することができます。
たとえば,レポートのすべての項目を
reports
ディレクトリに保管したり,
費用見積もりに関するデータおよびプログラムを
estimate
ディレクトリに保管することができます。
各ディレクトリにはファイルおよびディレクトリを含むことができます。
システム管理者がユーザのアカウントを設定する際に,ログイン・ディレクトリは必ず作成します。
しかし,システムで作業するうちに,作成あるいは編集したファイルを編成するための新たなディレクトリが必要になります。
新しいディレクトリは
mkdir
(make directory) コマンドを使用して作成します。
mkdir
コマンドの構文は次のとおりです。
mkdir
dirname
dirname 変数には新しいディレクトリ名を指定します。
システムはユーザの作業ディレクトリのサブディレクトリとして dirname ディレクトリを作成します。 つまり,新しいディレクトリを現在のディレクトリの 1 レベル下に作成します。
次の例では,cd
コマンドを入力してログイン・ディレクトリに戻り,project2
ディレクトリを作成します。
$ cd $ mkdir project2 $
ここで,相対パス名を入力して,reports
ディレクトリ内にサブディレクトリを作成します。
$ mkdir reports/status $
図 4-1
に現在のファイル・システムのツリー構造を示します。
project
,project2
,および
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 $
相対パス名を使用すると,少ないキーストロークでディレクトリを変更することができます。 相対パス名には次のような記号を使用します。
ドット (. および ..)
チルダ (~)
すべてのディレクトリには,ドット (.
) とドット・ドット (..
) で表現される 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
コマンドを実行して,ディレクトリの内容を表示しています。
project
,project2
,reports
の各ディレクトリにはスラッシュが付いています。
$ 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 $
reports
サブディレクトリ内のファイル,file1
,file2
,file3
,notes
に加えて,サブディレクトリ
status
が
project
ディレクトリにコピーされます。
4.5 ディレクトリ名の変更 (mv コマンド)
ディレクトリが同じディスク・パーティションに含まれている場合に限り,mv
コマンドを使用して,ディレクトリ名を変更することができます。
mv
コマンドの構文は次のとおりです。
mv
olddirectoryname newdirectoryname
olddirectoryname 変数には,移動または名前の変更を行いたいディレクトリの名前を指定します。 newdirectoryname 変数には,新しいディレクトリ名を指定します。
次の例では,まず
reports
ディレクトリに移り,ls -i -d
コマンドを入力して,status
ディレクトリのファイル通し番号をリストします。
$ cd reports $ ls -i -d status 1091 status $
ここで,mv
コマンドを入力して,ディレクトリ名
status
を
newstatus
に変更します。
次に,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
コマンドを使用して,schedule
,tasks
および
costs
の各ディレクトリを作成します。
その後,project2
ディレクトリの内容をリストします。
$ cd project2 $ mkdir costs schedule tasks $ ls -F costs/ schedule/ tasks/ $
最後に,cd
コマンドを使用してログイン・ディレクトリに戻ります。
$ cd $ pwd /u/uname $
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 *
),現在のディレクトリからすべての空ディレクトリが削除されます。 パターン照合文字 * の使用に際しては,十分に注意してください。
現在のディレクトリで作業している間は,そのディレクトリを削除することはできません。
他のディレクトリに移ってから削除する必要があります。
通常は,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
オプションを使用すると,多くのプロンプトに対して応答しなければならない場合があります。