Bash Basics | Basicsトップページ | トップページ

ディレクトリとパス

ディレクトリはツリー状の階層構造持つことができ、それぞれのディレクトリに各ファイルを仮想的に保管しているように見せることができます。
このため、ユーザーはファイルシステム上の各ディレクトリごとにファイルを管理することができます。
ディレクトリやファイルの位置を示すためには、それぞれのディレクトリやファイルまでの経路を「/」で区切って/home/user1や、/usr/local/bin、/varのように表記し、このような経路を「パス」と呼びます。

ディレクトリ構造の例
  • / (root)
    • bin
    • dev
    • etc
    • home
    • lib
    • root
    • sbin
    • sys
    • tmp
    • usr
      • bin
      • etc
      • lib
      • local
        • bin
        • etc
        • lib
        • sbin
        • src
      • sbin
      • src
    • var
Filesystem Hierarchy Standard (FHS)では、Linuxを含むUnix系OSでの主なディレクトリとその内容を定めています。
多くのLinuxディストリビューションは、FHSに準拠しており、下記のような標準的なディレクトリ構成をもっています。
パスディレクトリに含まれる内容
/ (ルート)最上位(トップレベル)のディレクトリ
/binシングルユーザーモードで必要となる一般ユーザー向けの基本的なコマンド
/bootOSの起動に必要なブートローダー関連のファイル
/devデバイスファイル
/etcOSやアプリケーションの設定ファイル
/etc/opt/opt/のための設定ファイル
/etc/X11X Window System, Version 11用の設定ファイル
/etc/sgmlSGMLの設定ファイル
/etc/xmlXMLの設定ファイル
/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/X11R6X 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


絶対パス (Absolute Path)

ディレクトリの位置を表現するために、最上位の/(ルートディレクトリ)からの一意な全てのパスを明示することを「絶対パス」と呼びます。
例えば、/home/user1や/usr/local/bin、/varは全て絶対パスによる表記です。

  • / (root)
    • home
      • user1
        • /home/user1
    • usr
      • local
        • bin
          • /usr/local/bin
        • lib
          • /usr/local/lib
    • var
      • /var


相対パス (Relative Path)

絶対パスはディレクトリの位置を一意に表現することができましたが、最上位の/から指定する必要があり、ディレクトリの階層が深い場合などでは煩雑になります。
このため、カレントディレクトリから見た相対的なパスを指定する方法として「相対パス」が使用できます。
具体的には、以下の2つの表記を組み合わせて指定します。

表記意味
.現在のディレクトリ
..現在のディレクトリから見て1つ上のディレクトリ

例えば、/home/user1をカレントディレクトリとした場合、/home/userX、/usr/loca/bin、/varを相対パスで表記すると以下のようになります。
  • / (root)
    • home
      • user1
        • .
          (カレントディレクトリ)
      • userX
        • ./../userX
          または
          ../userX
    • usr
      • local
        • bin
          • ./../../usr/local/bin
            または
            ../../usr/local/bin
    • var
      • ./../../var
        または
        ../../var
$ 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というコンテンツの種類毎のディレクトリがある場合、コンテンツの編集を行う際、各ディレクトリ間を頻繁に移動するような例を想定してみます。

  • /home
    • user1
      • www
        • html
        • js
        • images
ディレクトリスタックにディレクトリを追加する場合はpushdコマンドを使い、ディレクトリスタックからディレクトリを削除する場合はpopdコマンドを使います。
ディレクトリスタックを確認する場合にはdirsコマンドを使います。
下記に実行例を示します。
$ cd ~/www
$ dirs -v
 0  ~/www
この状態ではスタックにはカレントディレクトリである~/wwwのみが積まれています。
pushdコマンドを使ってhtmlディレクトリに移動してみます。
$ pushd html
~/www/html ~/www
$ dirs -v
 0  ~/www/html
 1  ~/www
スタックに~/www/htmlが追加されました。
さらにpushdコマンドを使ってjsディレクトリに移動してみます。
$ pushd ../js
~/www/js ~/www/html ~/www
$ dirs -v
 0  ~/www/js
 1  ~/www/html
 2  ~/www
スタックに~/www/jsが追加されました。
さらにpushdコマンドを使ってimagesディレクトリに移動してみます。
$ pushd ../images
~/www/images ~/www/js ~/www/html ~/www
$ dirs -v
 0  ~/www/images
 1  ~/www/js
 2  ~/www/html
 3  ~/www
このようにpushdコマンドを使ってディレクトリを移動すると、0番目(一番新しい)のスタックに移動したカレントディレクトリがどんどん積み重なっていきます。
スタックに積まれているディレクトリに移動したい場合は、そのスタックの番号(一番新しいものを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
$ stat file
File: `a'
Size: 0 Blocks: 0 IO Block: 4096 通常の空ファイル
Device: 10303h/66307d Inode: 33163143 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ user1) Gid: ( 1000/ user1)
Access: 2022-03-11 14:14:21.156880390 +0900
Modify: 2022-03-11 14:14:21.156880390 +0900
Change: 2022-03-11 14:14:21.156880390 +0900
Birth: -
$ cat file > /dev/null
$ stat file
File: `a'
Size: 0 Blocks: 0 IO Block: 4096 通常の空ファイル
Device: 10303h/66307d Inode: 33163143 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ user1) Gid: ( 1000/ user1)
Access: 2022-03-11 14:25:11.020822693 +0900
Modify: 2022-03-11 14:14:21.156880390 +0900
Change: 2022-03-11 14:14:21.156880390 +0900
Birth: -
最終修正日時
Last Modification
最後にファイルの内容を更新した日時を保存しています。
ファイルへ書き込みを行った場合に日時が更新されます。
$ echo "Hello" > file
$ stat file
File: `a'
Size: 0 Blocks: 0 IO Block: 4096 通常の空ファイル
Device: 10303h/66307d Inode: 33163143 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ user1) Gid: ( 1000/ user1)
Access: 2022-03-11 14:25:11.020822693 +0900
Modify: 2022-03-11 14:32:54.734893578 +0900
Change: 2022-03-11 14:32:54.734893578 +0900
Birth: -

ファイルに追記するとファイルの内容とともにサイズが変わるため、最終修正日時と最終状態変更日時が更新されます。
$ vi file # viでファイルを開いて保存します
$ stat file
File: `a'
Size: 0 Blocks: 0 IO Block: 4096 通常の空ファイル
Device: 10303h/66307d Inode: 33163146 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ user1) Gid: ( 1000/ user1)
Access: 2022-03-11 14:34:52.193335099 +0900
Modify: 2022-03-11 14:34:52.193335099 +0900
Change: 2022-03-11 14:34:52.193335019 +0900
Birth: -

viでファイルを保存すると内部的には新しいファイルとして保存しなおされるため、最終修正日時と最終状態変更日時が更新されます。
最終状態変更日時
Last Change
最後にファイルのiノード情報を更新した日時を保存しています。
ファイルの権限や所有者などファイルシステムに保存されるiノード情報を更新した場合に日時が更新されます。
$ chmod 644 file
$ stat file
File: `a'
Size: 0 Blocks: 0 IO Block: 4096 通常の空ファイル
Device: 10303h/66307d Inode: 33163146 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ user1) Gid: ( 1000/ user1)
Access: 2022-03-11 14:34:52.193335099 +0900
Modify: 2022-03-11 14:34:52.193335099 +0900
Change: 2022-03-11 14:38:17.218902305 +0900
Birth: -