6.4 ファイルの参照とディレクトリの移動
Linux Essentials Online Text | 2021/07/21

コンピュータの基本的な作業は、情報(=データ)を処理することにあります。コンピュータに処理されたデータを成果として残しておく場合、その方法としてファイルという概念が用いられます。文章を作成したら文書ファイルを保存しますし、デジカメで撮った写真は画像ファイルをパソコンに保存しておく、といった具合です。

ファイルの数が増えると内容や用途といった目的別に分ける必要が出てきます。このときに必要なものが、ディレクトリという考え方です。ディレクトリは複数のファイルをまとめておくことが可能で、ディレクトリの中にさらにディレクトリを作成することも可能です。文書ファイルを纏めておく本棚、画像ファイルを纏めておくアルバム、引き出しのようなものです。Windowsでは「フォルダ」と言いますが、どちらも同じものを指していると考えて差し支えありません。

ファイルやディレクトリの参照 (ls)

CUI上でファイル操作を行う上で一番最初に必要になるコマンドは、ファイルやディレクトリの一覧を取得するコマンドです。Linuxでは、「ls(LiSt)」がそのコマンドにあたります。

書式:

ls [オプション] [ファイルまたはディレクトリ]

主なオプション:

-a [.(ドット)]で始まる隠しファイル等もすべて(All)表示します。
-l長(Long)形式で出力します。
-t最終修正時間(Time)で並び替えをして出力します。
-d指定したディレクトリ自体の情報を表示します。(通常は中身を表示します。)
-r逆順(Reverse)に並び替えをします。
-R指定したディレクトリの中を再帰的に表示します。

lsコマンドではファイル名やディレクトリ名を指定して情報を取得することが可能で、ディレクトリ名を指定した場合、そのディレクトリの中にあるファイルやディレクトリ名の一覧を取得することができます。ファイルやディレクトリの指定を省略した場合はカレント(現在の)ディレクトリを参照します。ディレクトリ自体の情報を確認する場合は[-d]オプションを使用します。

<実習: lsコマンドの実行>

コンソール上で、「ls /var」と入力します。

$ ls /var
adm    crash  empty  gopher    lib    lock  mail  opt       run    tmp
cache  db     games  kerberos  local  log   nis   preserve  spool  yp

CentOSで実行した場合、ファイル名やディレクトリ名に色が付きますが、青色はディレクトリを表します。水色はシンボリックリンク、緑の網掛けはスティッキービットがついたディレクトリです。それぞれの意味については後述しますが、このように色をみれば、どういう種類かがわかるようになっています。

次に、/var/logディレクトリの中にどのようなディレクトリやファイルがあるか、確認してみましょう。

$ ls /var/log
anaconda	btmp	firewalld	        	maillog		rhsm	  tallylog
audit		  cron	grubby_prune_debug	messages	secure	tuned
boot.log	dmesg	lastlog			        qemu-ga	  spooler	wtmp

白文字で表示されているのがファイルです。/var/logの中には、多くのディレクトリ、ファイルが存在していることがわかります。「/var」「/var/log」の結果を見ると青色がディレクトリであることはわかりますが、コマンドを入力する時は色を付けることはできません。では、コマンドではどうやってディレクトリを表現するのでしょうか。

ディストリビューションによっては、コマンドの結果を色で種別を区別しないものもあり、この様な場合、ディレクトリには文字の末尾に「/」をつけてディレクトリであることを表現します。これと同じように文字の末尾に「/」をつければディレクトリとして表現できます。
ただ、通常はシステムが勝手に解釈するため、コマンド上では「/」はつけなくても動作します。同名のファイルとディレクトリが存在する場合に限り、「/」を付ける事で区別します。

今度は「ls」のみで実行してみます。

$ ls
$

ファイルやディレクトリの指定が無い場合はカレント(現在の)ディレクトリを参照しますが、何も表示されませんでした。これはこのディレクトリにはファイルやディレクトリが存在しないためです。このように指定したディレクトリに、ディレクトリやファイルが何もない場合には何も表示されません。

今度は、オプションを使ってみます。コンソール上で「ls -l」入力してみましょう。

$ ls -l /var
合計 4
drwxr-xr-x.  2 root root    6  4月 11   2018   adm
drwxr-xr-x.  6 root root   59	  5月 27  15:22   cache
drwxr-xr-x.  2 root root    6  4月  2  22:27   crash
                    :

オプションは「-(ハイフン)」をつけて指定します。lsコマンドにおける「l」オプションは「情報を長(Long)形式で出力する」という命令になりますので、上記のように情報が長形式で出力されます。上記例では /varというディレクトリ内に存在する全てのファイルやディレクトリに対して詳細の情報が取得できたという事になります。

なお、ファイルを指定すると指定したファイルの詳細情報が表示されます。ディレクトリを指定すると、指定したディレクトリの“中身”が表示されますが、「-d」オプションを付けて実行するとディレクトリ自体の詳細情報を表示させることができます。

$ ls -l /var/log/dmesg
-rw-r--r--.  1 root root   59	 5月 27  15:36  /var/log/dmesg
$ ls -ld /var
drwxr-xr-x.  19 root root 267   5月 27  15:36  /var

ドットファイルの表示

今度は「-a」オプションを使ってみましょう。次のように入力します。

$ ls -la
合計 16
drwx------.   2 lpic-user	lpic-user    83   5月 27  20:04  .
drwxr-xr-x.   3 root	      root	      24   5月 27  15:29  ..
-rw-------.  1 lpic-user	lpic-user    13   5月 27  20:04  .bash_history
-rw-r--r--.  1 lpic-user	lpic-user    18   4月  1  11:17  .bash_logout
-rw-r--r--.  1 lpic-user	lpic-user   193   4月  1  11:17  .bash_profile
-rw-r--r--.  1 lpic-user	lpic-user   231   4月  1  11:17  .bashrc

オプションを使用しないときは何も表示されませんでしたが、「-a」オプションを付けたことでファイルが4つ表示されるようになりました。これは隠しファイルが表示されたためです。UNIX系OSでは”ファイル名に「.(ドット)」で始まるファイルは隠しファイルである”という取り決めがあります。そして、隠しファイルは「-a」オプションをつけたときにしか表示されません。

オプションの同時指定と順序

複数のオプションを指定したい時、殆どの場合は「-(ハイフン)」の後に羅列するか、「-(ハイフン)」で都度指定します。オプションを複数使用する場合、基本的に順不同で問題ありません。

$ ls -la
$ ls -al
$ ls -l -a
$ ls -a -l

上記、どのコマンドを実行しても同じ結果が表示されます。
今度は「-lat」オプションを付けてのlsコマンドを実行してみます。

$ ls –lat
合計 32
drwx------.   2 lpic-user  lpic-user    83  5月 27  20:04  .
-rw-------.  1 lpic-user  lpic-user    13   5月 27  20:04  .bash_history
drwxr-xr-x.   3 root      root         24   5月 27  15:29  ..
-rw-r--r--.  1 lpic-user  lpic-user   18   4月  1  11:17  .bash_logout
-rw-r--r--.  1 lpic-user  lpic-user  193   4月  1  11:17  .bash_profile
-rw-r--r--.  1 lpic-user  lpic-user  231   4月  1  11:17  .bashrc

「t」オプションは最終修正時間で並び替えをして出力します。ファイルの更新時間の順に並んでいるのがわかります。

再帰的に表示

オプションに記載した「-R」オプションはリカーシブ(Recursive)から来ています。直訳すると「再帰的に」という意味になります。簡単に言うと指定したディレクトリのサブディレクトリを含めた全てを対象にします。という意味です。
つまり、ディレクトリの中にディレクトリがあれば、それを対象とし、さらにそのディレクトリの中にディレクトリがあればそれを対象とし、と、最後の階層まで確認する、ということです。lsコマンドだけでなく、他のコマンドでも同様の意味を持つオプションを持つものがありますが、考え方は同じです。

<-Rオプションのコマンド実行>

$ ls -R /var/log

ディレクトリ構造

ディレクトリ構造とは、ファイルとそのファイルを格納するディレクトリ(フォルダ)によって構成された階層構造のことを言います。Linuxを含むUNIX系と呼ばれるOS の場合、FHS(Filesystem Hierarchy Standard)というディレクトリ構成の規格に基づいて作成されています。FHSは、簡単に言うとLinuxのディレクトリ構造を作る時の指標です。構造そのものや、ディレクトリの名前、各ディレクトリの役割(どのようなファイルを含むか)等の取り決めです。

WindowsOSもLinuxOSも階層構造を持っていますが、WindowsOSとLinuxOSとの根本的な違いがあります。前者が「個々の物理装置ごとにディレクトリ構造を作る」のに対し、後者は「大きな一つのディレクトリ構造に個々の物理装置を格納する」というところにあります。

下の左図のようにWindowsOSはHDD、フロッピーディスク、CD-ROMなどの物理装置ごとに階層構造が構成されています。一方でLinuxOSは、ただひとつの「/(ルート)」という論理的に定められた最上位のディレクトリ以下に、全ての物理装置が格納されるという構造をとります。

WindowsOSのディレクトリ構造イメージUNIX系OSのディレクトリ構造イメージ

絶対パス

パスとは対象のファイルやディレクトリに辿り着くための経路を表すものです。パスには2つの種類があり、誰が、どこからどのように辿っても必ず対象のファイルやディレクトリに辿り着くことができるパスを「絶対パス」と言います。先程のWindowsOSとLinuxOSの階層構造の図を使って、ファイル名「FileA211」やディレクトリ「DiskB11」、「Cdrom-B」を絶対パスで考えてみます。

WindowsOSのディレクトリ構造イメージUNIX系OSのディレクトリ構造イメージ

WindowsOSは、物理デバイスごとにツリー構造が構成されていて、先頭にC:やE:といった、物理ドライブを示す記号(ドライブレターといいます)を使用されます。そのため、対象のファイルやディレクトリがどの物理ドライブに格納されているかによって、先頭の文字が変わります。

一方、UNIX系のOSの場合は、「/(ルート)」という論理的に定められた最上位のディレクトリを頂点とする大きな1本のツリー構造です。そのため、絶対パス表記の場合には必ず先頭が「/(ルート)」で始まります。どのディレクトリにいても指定できるパスですが、常に/から指定するので非常に記述が長くなることがあります。

実際に記述すると、以下のようになります。

対象ファイル ディレクトリWindowsOSUNIX系OS
FileA211C:\DiskA2\DiskA21\FileA211/DiskA2/DiskA21/FileA211
DiskB11D:\DiskB1\DiskB11\/DiskB1/DiskB11/
Cdrom-BE:\Cdrom\Cdrom-B\/mnt/cdrom/Cdrom_B/

相対パス

OSの操作を行うとき、必ず「作業場所」が存在します。GUIで言えば、アクティブになっているフォルダ(ディレクトリ)のことです。 絶対パスは必ず「/(ルート)」を起点としてパスを表示しますが、相対パスはこの「作業場所」を起点として、対象のパスを表示します。

例えば、以下のようなディレクトリ構造で、「DiskB12」が作業場所である場合のファイル「FileB121」とディレクトリ「DiskB11」、「UDiskA2」の相対パスを考えてみます。

それぞれのファイル、ディレクトリを絶対パス、相対パスで表すと、以下のようになります。

 絶対パス相対パス
FileB121/DiskB1/DiskB12/FileB121FileB121
DiskB11/DiskB1/DiskB11../DiskB11
UDiskA2/mnt/UDiskA/UDiskA2../../mnt/UDiskA/UDiskA2

ファイル「FileB121」は、ディレクトリ「DiskB12」からみると同ディレクトリ内に格納されています。そのため、単純にファイル名がそのままパスになります。
ディレクトリ「DiskB11」は、ディレクトリ「DiskB12」からみると同列、つまりどちらもディレクトリ「DiskB1」に格納されています。指定するには、現在の場所から一度上の階層に上がり「DiskB1」に進んでから「DiskB11」にアクセスします。

では、ディレクトリ「UDiskA2」はどうでしょうか。「UDiskA2」は「mnt」ディレクトリ内に格納されています。「mnt」ディレクトリは「/(ルート)」に格納されています。つまり、「DiskB12」から辿るには一度「/(ルート)」まで上がり、「mnt」ディレクトリへアクセスすることになります。

相対パス表記では、カレントディレクトリの下位のディレクトリだけではなく、上位のディレクトリや上位のディレクトリからたどった先の別のディレクトリも表記できます。現在位置から上位のディレクトリを指定するには、「..」を使用します。

このように「相対パス」とは、「現在位置(カレントディレクトリ)からみて」ディレクトリ・ファイル名を指定する方法です。この指定方法はカレントディレクトリが変更されると相対的に変化しますが、現在の位置から見て非常に近いディレクトリを指定する際は記述が短くて済む、という特徴があります。

マウントとは

UNIX系OS独特の表現です。
WindowsOSは、記憶装置デバイス(HDD/SSDやCD/DVD、USBメモリ等)毎にドライブレターが割り当てられて、デバイスごとにツリー構造を持つことができます。そのため、それぞれのデバイスのドライブツリーへアクセスすれば目的のファイルやディレクトリに辿り着くことができます。

一方で、Unix系OSの場合は必ず「/(ルート)」を通る一つの大きなツリー構造です。これは、どんなデバイスが接続された場合も変わりません。
つまり、Unix系OSで別のデバイスにアクセスするには、「/(ルート)」を頂点としたツリー構造の中の何れかの枝にくっつけてあげる必要があります。この「何処かの枝にくっつける」という行為のことを「マウント」と呼びます。

マウントをするには予め「マウントポイント」と呼ばれるディレクトリを作成しておきます。何処に作ってもマウントすることは可能ですが、通常は「/mnt」や「/media」というディレクトリが用意されており、そこにマウントポイントを作成します。
マウントする頻度が高いファイルや、予めマウントしておきたいデバイスがある場合は/etc/fstabファイルに記載しておきます。

現在のディレクトリの表示(pwd)

現在、どの階層構造上のどの位置にいるか表示するのが、この「pwd(Print Working Directory)」コマンドです。

書式:

pwd

<実習: pwdコマンドの実行>

$ pwd
/home/lpic-user

現在、このユーザは/home/lpic-userというディレクトリにいることがわかります。
※ 「lpic-user」部分には、設定したユーザ名が入ります。

ディレクトリの移動(cd)

現在いるディレクトリから別のディレクトリに移動するコマンドが「cd(Change Directory)」コマンドです。

書式:

cd [ディレクトリ名]

ディレクトリを省略する場合はホームディレクトリ(後述)に移動します。

<実習: cdコマンドの実行>

$ pwd
/home/lpic-user
$ cd /var/log
$ pwd
/var/log

/home/lpic-userから、/var/logディレクトリに移動する事ができました。
今度は上の階層に移動してみましょう。

$ cd ..
$ pwd
/var

最後に、ディレクトリ(ホームディレクトリ)へ戻ってきましょう。
ホームディレクトリに戻る方法はいくつかあります。

$ cd /home/lpic-user
$ cd
$ cd ~
$ cd $HOME

ディレクトリの特殊な表現

Linuxには、特別なディレクトリやそれを表す記号があります。以下に代表的なものを紹介します。

記号説明
.カレントディレクトリ。現在いるディレクトリです。
「.」は「ピリオド」とか「ドット」と読みます。
./カレントディレクトリ。上の「.」と同じです。
相対パスでカレントディレクトリを表す場合、このように表示することがあります。
..親ディレクトリ。つまり、現在いるディレクトリの1階層上のディレクトリです。
カレントディレクトリが/home/lpic-userとなら/homeが親ディレクトリにあたります。
~ホームディレクトリ。
ユーザの作業開始位置となるディレクトリです。「~」は「チルダ」と読みます。ログイン直後のユーザは必ずホームディレクトリにいます。そのためユーザごとにパスが異なります。「$HOME」もホームディレクトリと同じ意味を持ちます。
/ルートディレクトリ。
ディレクトリ階層の、最上位階層を示します。
PAGE TOP