Bash Basics | Basicsトップページ | トップページ
ディレクトリとパス
UNIX OS、およびUnix系OSではディスクなどの補助記憶装置上に格納されたデータをファイルとして保存し、ファイルを保存・管理するシステムとしてファイルシステムが存在しています。
ファイルシステムは階層構造となっていて各ファイルをディレクトリという仮想的(論理的)なグループとして管理しています。
ディレクトリはツリー状の階層構造持つことができ、それぞれのディレクトリに各ファイルを仮想的に保管しているように見せることができます。
このため、ユーザーはファイルシステム上の各ディレクトリごとにファイルを管理することができます。
ディレクトリやファイルの位置を示すためには、それぞれのディレクトリやファイルまでの経路を「/」で区切って/home/user1や、/usr/local/bin、/varのように表記し、このような経路を「パス」と呼びます。
多くのLinuxディストリビューションは、FHSに準拠しており、下記のような標準的なディレクトリ構成をもっています。
| パス | ディレクトリに含まれる内容 |
|---|---|
| / (ルート) | 最上位(トップレベル)のディレクトリ |
| /bin | シングルユーザーモードで必要となる一般ユーザー向けの基本的なコマンド |
| /boot | OSの起動に必要なブートローダー関連のファイル |
| /dev | デバイスファイル |
| /etc | OSやアプリケーションの設定ファイル |
| /etc/opt | /opt/のための設定ファイル |
| /etc/X11 | X Window System, Version 11用の設定ファイル |
| /etc/sgml | SGMLの設定ファイル |
| /etc/xml | XMLの設定ファイル |
| /home | ユーザーのホームディレクトリ |
| /lib | /bin/や/sbin/にある実行ファイルが参照する共有ライブラリ、カーネルモジュール |
| /media | リムーバブルメディアのマウントポイント |
| /mnt | 一時的なマウントポイント |
| /opt | オプションのアプリケーションの実体など読取専用のファイル |
| /proc | カーネルやプロセスの情報を示す仮想ファイルシステム |
| /root | システム管理者であるrootのホームディレクトリ |
| /run | 実行時の可変データ |
| /sbin | システム管理用のコマンド |
| /srv | システムによって提供されたサイト固有のデータ |
| /sys | デバイス、ドライバ、および一部カーネル機能に関する情報 |
| /tmp | 一時的なファイル、再起動時に内容を保持しない |
| /usr | ユーザーのためのユーティリティやアプリケーションが利用する最上位ディレクトリ |
| /usr/bin | ユーザーが利用する基本的ではない(シングルユーザーモードで必要とされない)コマンド |
| /usr/include | プログラム開発で用いるヘッダーファイル |
| /usr/lib | /usr/bin/や/usr/sbin/にある実行ファイルが参照する共有ライブラリ |
| /usr/local | ホスト固有のローカルファイル |
| /usr/sbin | 基本的でないシステムコマンド |
| /usr/share | アーキテクチャに依存しないデータ |
| /usr/src | ソースコード |
| /usr/X11R6 | X Window System, Version 11 Release 6 |
| /var | 内容が変化するようなファイル、例えば、ログ、スプール、一時的な電子メールファイルなど |
| /var/cache | アプリケーションのキャッシュデータ |
| /var/lib | 状態情報、プログラムの実行によって更新された永続性のデータなど |
| /var/lock | ロックファイル |
| /var/log | ログファイル |
| /var/mail | ユーザーのメールボックス |
| /var/run | システム起動以降の稼働中システムに関する情報 |
| /var/spool | 処理待ち状態のタスクのスプール、例えば、プリントキュー、未読メールなど |
| /var/tmp | 一時的なファイル、再起動しても内容が保持される |
シェルからコマンドを実行する場合、ディレクトリのツリー内のどこかを基点として作業を行います。基点となる作業を行っている現在のディレクトリを「カレントディレクトリ(または作業ディレクトリ)」と呼びます。
ユーザーがOSにログインした際に割り当てられるディレクトリを「ホームディレクトリ」とよび、シェルを起動するとホームディレクトリがカレントディレクトリとなります。
カレントディレクトリを確認するには、pwdコマンドを使用します。
$ pwd
/home/user1
カレントディレクトリを変更するには、cdコマンドを使用します。$ cd /tmp
$ pwd
/tmp
$ cd /var/tmp
$ pwd
/var/tmp
cdコマンドを引き数なしで実行するとユーザーのホームディレクトリに移動します。$ cd /tmp
$ pwd
/tmp
$ cd
$ pwd
/home/user1
ディレクトリの位置を表現するために、最上位の/(ルートディレクトリ)からの一意な全てのパスを明示することを「絶対パス」と呼びます。
例えば、/home/user1や/usr/local/bin、/varは全て絶対パスによる表記です。
絶対パスはディレクトリの位置を一意に表現することができましたが、最上位の/から指定する必要があり、ディレクトリの階層が深い場合などでは煩雑になります。
このため、カレントディレクトリから見た相対的なパスを指定する方法として「相対パス」が使用できます。
具体的には、以下の2つの表記を組み合わせて指定します。
| 表記 | 意味 |
|---|---|
| . | 現在のディレクトリ |
| .. | 現在のディレクトリから見て1つ上のディレクトリ |
$ pwd
/home/user1
$ cd ../userX
$ pwd
/home/userX
$ cd
$ pwd
/home/user1
$ cd ../../usr/local/bin
$ pwd
/usr/local/bin
$ cd
$ pwd
/home/user1
$ cd ../../var
$ pwd
/var
ディレクトリの移動はcdコマンドで行いますが、複数のディレクトリ間を頻繁に移動する場合、移動したいディレクトリをスタック上に保存して簡単に呼び出す方法があります。
例えば、ホームディレクトリである/home/user1にwwwというWebコンテンツを配置するディレクトリがあり、その下にhtml、js、imagesというコンテンツの種類毎のディレクトリがある場合、コンテンツの編集を行う際、各ディレクトリ間を頻繁に移動するような例を想定してみます。
$ cd ~/www
$ dirs -v
0 ~/www
この状態ではスタックにはカレントディレクトリである~/wwwのみが積まれています。$ pushd html
~/www/html ~/www
$ dirs -v
0 ~/www/html
1 ~/www
スタックに~/www/htmlが追加されました。$ pushd ../js
~/www/js ~/www/html ~/www
$ dirs -v
0 ~/www/js
1 ~/www/html
2 ~/www
スタックに~/www/jsが追加されました。$ pushd ../images
~/www/images ~/www/js ~/www/html ~/www
$ dirs -v
0 ~/www/images
1 ~/www/js
2 ~/www/html
3 ~/www
このようにpushdコマンドを使ってディレクトリを移動すると、0番目(一番新しい)のスタックに移動したカレントディレクトリがどんどん積み重なっていきます。$ pushd +2
~/www/html ~/www ~/www/images ~/www/js
$ dirs -v
0 ~/www/html
1 ~/www
2 ~/www/images
3 ~/www/js
スタックに積まれているディレクトリ間で移動すると、そのディレクトリを最新としてスタックがローテーションします。$ pushd -1
~/www/images ~/www/js ~/www/html ~/www
$ dirs -v
0 ~/www/images
1 ~/www/js
2 ~/www/html
3 ~/www
UNIXのファイルシステムではファイルに関する情報はiノードと呼ばれるテーブルで管理されています。
iノードには下記の情報が含まれており、ファイルに対するタイムスタンプもiノードで管理されています。
| 情報 | 説明 |
|---|---|
| 所有者 | ファイル、またはディレクトリの所有者IDを保存しています。 |
| 所有グループ | ファイル、またはディレクトリの所有グループIDを保存しています。 |
| モード(権限) | ファイル、またはディレクトリのアクセス権限を保存しています。 |
| 最終アクセス日時 Last Access | 最後にファイルにアクセスした日時を保存しています。 ファイルを読み込んだ場合に日時更新されます。 ファイルを新規に作成した場合には作成した日時となります。 $ touch file
$ cat file > /dev/null
|
| 最終修正日時 Last Modification | 最後にファイルの内容を更新した日時を保存しています。 ファイルへ書き込みを行った場合に日時が更新されます。 $ echo "Hello" > fileファイルに追記するとファイルの内容とともにサイズが変わるため、最終修正日時と最終状態変更日時が更新されます。 $ vi file # viでファイルを開いて保存しますviでファイルを保存すると内部的には新しいファイルとして保存しなおされるため、最終修正日時と最終状態変更日時が更新されます。 |
| 最終状態変更日時 Last Change | 最後にファイルのiノード情報を更新した日時を保存しています。 ファイルの権限や所有者などファイルシステムに保存されるiノード情報を更新した場合に日時が更新されます。 $ chmod 644 file |