ディレクトリ / パス
注: Ubuntu Linux 16.04を想定しています。
ディレクトリ
データやプログラムが保存されている場所を「ディレクトリ」と呼ぶ。Windowsの「フォルダ」の概念とほぼおなじである。同じ概念を, Windowsではフォルダと呼び, Linuxではディレクトリと呼ぶ。
では, ディレクトリの操作を練習しよう。
[課題1] コンソールを立ち上げ、以下の操作をしよう。前回も述べたように、$はプロンプト、つまりシェルが君に「コマンドを入れてください」と待っているしるしなので、君は$を入力する必要は無い。$のあとのコマンドだけををキーボードから打ち込んで、Enterキーを押せばよろしい。
$ pwd /home/sXXXXXXX(ユーザー名) $ cd .. $ pwd /home $ cd .. $ pwd / $ cd ~ $ pwd /home/sXXXXXXX(ユーザー名)
今, 君は, ディレクトリを、あちこち旅したのである。その旅の中で, cdとpwdというコマンドを使った。この2つのコマンドは大切なので覚えよう。その意味はこれからおいおい説明していく。
ディレクトリ・ツリー
まず, 君がやった旅を理解するには, 「ディレクトリは階層構造をしている」ことを理解する必要がある。つまり, ディレクトリの中にディレクトリがあり, さらにその中にもディレクトリがあり, ... というふうになっているのだ。このような入れ子状になっているディレクトリ群の全体をディレクトリ・ツリーと呼ぶ。
以下に、ディレクトリ・ツリーの様子を、模式的に示す。たとえば、/home/s1234567というディレクトリは、/というディレクトリの中のhomeというディレクトリの中のs1234567というディレクトリである:
/-- |---usr |---bin |---home--s1234565 | |----s1234566 | |----s1234567 | |----
カレント・ディレクトリ
シェルは, 常にディレクトリ・ツリーの中のどこかのディレクトリで仕事をすることになっている。そのような「シェルが今, 仕事場にしているディレクトリ」をカレントディレクトリという。シェルのコマンドは、特に何も指定しない限り、カレントディレクトリの内容を対象として働くのがルールである。
cdコマンド
ユーザーは、仕事をする(というかシェルに仕事をさせる)ときには、まず最初に、その仕事に必要なデータやプログラムのあるディレクトリにまず行く(というかシェルにそこに行かせる)必要がある。つまり, そこをカレントディレクトリにするのだ。その操作をするコマンドがcd (change directoryの略)である。cdはおそらくLinuxで最も多く使うコマンドのトップ3に入るほど大切なコマンドだ。
pwdコマンド
cdコマンドでカレントディレクトリを移動しているうちに,どこがカレントディレクトリになっているか, ユーザーは混乱してくることがある。そこで役立つのがpwdコマンドである。pwdは, カレントディレクトリがどこなのかを表示するコマンドだ(pwdはpresent working directoryの略である)。初心者はディレクトリ・ツリーの中で迷子になりがちだが、そういうときにpwdコマンドは便利である。pwdはおそらくLinuxで最も多く使うコマンドのトップ20に入る程度の, まあまあ大切なコマンドだ。
ホームディレクトリ
ターミナルとシェルを立ち上げた直後は、ほとんどの場合、自動的にカレントディレクトリは/home/s1234567のように、/home/ユーザー名というようなディレクトリになっている。そのことが、上の例の最初のコマンドで理解できるだろう。このようなディレクトリは、ユーザーが自由にデータを置いたり削除したりすることができるディレクトリであり、ホームディレクトリと呼ばれる。ホームディレクトリには、ユーザーの利用環境を設定するための情報なども保管される。
ここで注意! 「/home」は、homeという名前のディレクトリではあるが、いわゆる「ホームディレクトリ」ではない。ホームディレクトリは、「/home/s1234567」のように、/homeの下にあって、ユーザー名(ログイン名)を名前に持つようなディレクトリである。
".."はひとつ上のディレクトリ
さて, "cd .."というコマンドは、ひとつ上流の階層のディレクトリに行く、というコマンドである。".."は、カレントディレクトリから見てひとつ上流の階層のディレクトリを示す。実際、そのあとにpwdコマンドでカレントディレクトリを表示すると、"/home"のように、もとの"/home/s1234567"よりもひとつ上流のディレクトリに移っていることがわかる。
ルートディレクトリ"/"
さらに"cd .."を行うと、さらにひとつ上流のディレクトリに移る。このディレクトリは"/"と表示されているが、これより上流のディレクトリは無い。このディレクトリ、すなわち全てのディレクトリの最上流のディレクトリをルートディレクトリという。全てのディレクトリは、このルートディレクトリから次第に枝わかれして(入れ子になって)存在する。
ルートディレクトリは"/"であらわす。"/home/s1234567"のようにディレクトリの階層構造を表現するとき、"/"が、左端とまんなか付近というふうに2回あらわれるが、左端の"/"はルートディレクトリを意味し、まんなかの"/"は/homeとgisという2つのディレクトリの上流・下流関係をあらわすための記号、つまり、ディレクトリの境界をあらわす記号である。このあたりの事情については、後述の「パス」の項でも言及する。
ディレクトリに関する概念の整理
ここまでで若干混乱してきた人もいるだろうから, ちょっと整理しよう。
ルートディレクトリは、そのシステム(計算機)にはひとつしか無い。
一方、ホームディレクトリは、それぞれのユーザーごとに用意されているので、その計算機を使うユーザーの数だけ存在する(ただし、1人のユーザーにとっては、ホームディレクトリは1つだけである)。
カレントディレクトリは、ユーザーが適宜、cdコマンドで選ぶものである。
/や..も含めて、以下のようなの特別なディレクトリの表現方法がある:
. カレントディレクトリ .. ひとつ上の階層のディレクトリ / ルートディレクトリ ~ ホームディレクトリ
たとえば"cd /"は「ルートディレクトリをカレントディレクトリとせよ」だし, "cd ~"は「ホームディレクトリをカレントディレクトリとせよ」というコマンドである。
lsコマンド ... ディレクトリの中身の表示
ディレクトリの中には、ディレクトリやファイルが入っている。ファイルとは、文書とか、プレゼン資料とか、各種の設定情報など、それぞれ情報のひとまとまりの単位である(このあたりもWindowsなどと同様である)。ディレクトリの内容、つまりそのディレクトリの中にどのようなディレクトリやファイルが入っているかを表示するコマンドが、ls (listの略)である。lsはおそらくcdと並んでLinuxで最も多く使うコマンドのトップ3に入る大切なコマンドだ。以下、lsの機能を、体験的に学んでいこう。
[課題2] 以下のコマンドを打ち込みながら体で覚えよう:
$ cd ~ (ホームディレクトリに行く) $ ls (カレントディレクトリの内容を表示。) $ ls -l (lsよりもっと詳しい情報を表示。-lの前に、スペースをひとつ入れること。) $ ls -la (ls -laよりもっと詳しい情報を表示。) $ ls / (ルートディレクトリの内容を表示。)
以下は、ls -laの実行結果の例(一部分)である:
$ ls -la 計 1276896 drwx------ 40 s1234567 s1234567 4096 2018-08-08 08:56 ./ drwxr-xr-x 419 s1234567 s1234567 8192 2018-08-08 09:09 ../ -rw------- 1 s1234567 s1234567 560 2018-08-08 08:56 .Xauthority -rw------- 1 s1234567 s1234567 19 2018-09-14 16:40 .Xmodmap drwx------ 2 s1234567 s1234567 4096 2018-09-14 16:40 .acrobat/ drwx------ 3 s1234567 s1234567 4096 2018-08-06 15:15 .adobe/ -rw------- 1 s1234567 s1234567 6672 2018-08-06 18:29 .bash_history
これを解説すると、
1列目(drwx--x--xなど):パーミッション(後述)。先頭のdの有無は、ディレクトリかどうかのマーク。 2列目(40など): ファイル数 3列目(s1234567): 所有者のユーザー名(後述) 4列目(s1234567): 所有者のグループ名(後述) 5列目(4096など): ファイルサイズ(バイト数) 6-8列目(2015-08-08 08:56 など): 最終更新日時
mkdirコマンドとrmdirコマンド ... ディレクトリの作成と消去
[課題3] 以下のコマンドを打ち込みながら体で覚えよう:
$ mkdir test (testというディレクトリを作る。) $ ls -l (カレントディレクトリの内容を表示。testというディレクトリができているか?) $ rmdir test (testというディレクトリを削除。) $ ls -l
パス (path)
個々のディレクトリやファイルが、ディレクトリ・ツリーの中のどの位置にあるのか、つまりディレクトリやファイルの「住所」のような情報のことをパス (path)と言う。たとえば、さきほど作ったtestというディレクトリのパスは、このように表現できる:
/home/sXXXXXXX(ユーザー名)/test
これは、ルートディレクトリ(/)の中のhomeというディレクトリの中のgisというディレクトリの中のtestというディレクトリ、という意味。ちょうど、「茨城県つくば市天王台筑波大学」というのが、茨城県の中のつくば市の中の天王台の中にある筑波大学、という意味であるのと同じようなものである。このように、ルートディレクトリからたどってパスを表現するやりかたのことを「絶対パス」と呼ぶ。
ディレクトリの階層の区切りは、スラッシュ(/)で表現する(ちなみにWindowsでは、これが日本円やバックスラッシュ記号(\)になる)。すなわち、スラッシュ記号/には、「ルートディレクトリ」という意味と、「ディレクトリどうしの区切り」という意味の、2通りの意味がある。
絶対パスと対比的な言葉(対置概念)として「相対パス」というものがある。カレントディレクトリを起点に、どのようにディレクトリをたどっていけばそのファイル(又はディレクトリ)にたどり着くかというやりかたでパスを表現することを「相対パス」と呼ぶ。たとえば君が現在、/homeというディレクトリをカレントディレクトリにしていれば、
./sXXXXXXX(ユーザー名)/test
が、上記のディレクトリの相対パスになる。ここで"."はカレントディレクトリを意味する。相対パスでの表記は、例えば、私がつくば市内の知人に対して私の家を説明するとき、「竹園1丁目の公務員宿舎の・・・」と言うようなものである。相手がつくば市内にいるならば、わざわざ「茨城県つくば市」を言う必要はない。
lsなどのコマンドは、デフォルトではカレントディレクトリを対象とするが、パスを指定すれば、カレントディレクトリ以外のディレクトリを対象にすることもできる。
[課題4] 以下のコマンドを順に試し、結果を解釈せよ:
$ cd ~ $ pwd $ ls $ ls / $ mkdir test $ cd test $ pwd $ cd $ pwd $ cd /home/sXXXXXXX(ユーザー名)/test $ pwd $ cd
ホームディレクトリ(つまり/home/sXXXXXXX(ユーザー名))から/home/sXXXXXXX(ユーザー名)/testというディレクトリへ行くのに、相対パス指定(cd test)でも絶対パス指定(cd /home/sXXXXXXX(ユーザー名)/test)でもOKであるということがわかるだろう。
Keyword(s):
References:[コマンドサーチパス] [2018_実用解析] [Unix/Linux入門]