ファイルシステム

ファイルとは

ファイル file は、コンピュータが情報を管理する単位である。

ワープロで作成した文章も、音楽データも、動画データも、コンピュータにとっては全部数字の集まりに過ぎない。コマンドなどのプログラムも同様に数字の集まりである。しかし、それぞれのデータやプログラムは、それぞれの集まりとして区別した方が都合がよい。その区別する単位がファイルである。

fileは元々は「綴じた書類」という意味の英単語。

例えば、ワープロで作成した文書を考えてみよう。作成しただけではワープロアプリを終了すると消えて無くなってしまうので保存することになる。この保存した文書がファイルとなる。文書ごとに別のファイルになるのは自然だろう。一旦ファイルとして記録されれば、ファイルの置き場所を移動させたり、コピーしたり、ワープロアプリで開いて修正したり、削除したり、といった操作ができる。

macOSのようなGUI画面ではアイコンで表示されているので理解しやすいだろう。アイコン一つ一つが、それぞれのファイルである。歴史的には逆で、ファイルという抽象的な概念を一般ユーザでも理解しやすいように視覚化したものがアイコンである。

現在のコンピュータシステムのほとんどがファイルという単位で情報を管理している。スマートフォンやゲーム機などではファイルをユーザに見せないような作りになっているが、内部的にはファイルを使用している。

なお、UNIXの特徴として、データやプログラム以外に、装置もファイルとして扱っている。この仕組みにより、ハードディスク上のファイルでも、通信先の相手でも、同じようにしてデータを読み書きできるようになっている。

ファイル名

UNIXでは大量のファイルを扱うので、ファイルを区別する必要があるし、指定する必要もある。そのために、ファイルには必ず名前を付けることになる。

ファイル名は、OSとして最初から用意されているファイルに関しては予め付けられているのでそのまま使えばよい。勝手にファイル名を変更すると不要なトラブルになりかねないので注意すること(技術的なことを知った上で変更することはあるかもしれないが、知らないのに変えてはいけない。重要なファイルはうっかり変更してしまわないようにはなっているが)。自分で作ったファイルに関しては、好きなように名前をつけることができる。通常はファイルの内容が分かるような簡潔な名前にするのがよいだろう。なお、ファイル名の長さはOSによって上限があり、macOSでは255文字(漢字は1文字で2文字扱い)まで、となっている。

ファイル名には、技術的には漢字を含むほとんどの文字を使用することができるが、一部文字は決まった用途に使われるため使用できないものもある(使用できても少し特殊な指定の仕方をする必要があったりして面倒臭い)。漢字はOSによって扱いが異なることがあるため注意が必要である。例えばmacOSで作成したファイルをLinuxやWindowsに転送して使おうとするとファイル名が変になってしまうということが起こりうる。プログラムからファイルを指定する際にも問題が起きやすい。日本語入力できないとファイルを指定できないという問題もあるだろう。

最近のOSはUnicodeという世界共通の文字コードを標準で使用するようになってきているので問題は起きにくくなったが、古いOSのことも配慮しなければならないのが世の常である。

このように、問題の起きにくいファイル名をつけるためには、アルファベット(大文字・小文字)、数字、アンダースコア(_)、ハイフン(-)、ピリオド(.)のみを使うのが良いだろう。これら以外の記号や漢字はトラブルの原因になりやすい。ワープロや表計算ソフトのような、特定のパソコン上で特定の用途にしか使わないファイルなら日本語で名前を付けた方が区別しやすくてよいだろうが、プログラムやプログラムから読み書きするデータファイルなどはこの名付けルールに従って欲しい。

拡張子

ファイル名中、ピリオド(.)の扱いは特殊である。ファイル名中の最後の.より右側の文字列は、ファイルの種類を表すという約束になっている。この.以降の文字列を拡張子(かくちょうし)と呼ぶ。例えば.txtは文字のみのファイル(テキストファイル)、.pngはPNG形式の画像ファイル、.pagesはPagesで作成したファイル、といった具合である。拡張子の付け方は、習慣となっているもの、OSが定めているもの、アプリケーションによって定められているもの、と様々である。世の中でどのような拡張子が使われているかは調べてみるとよいだろう(かなり沢山ある)。

拡張子の扱いはOSによって異なっている。UNIXでは実際には単なる名前の一部という扱いしかしていない。Windowsでは拡張子でファイルの種類を区別している。macOSでは扱いが混在していて、拡張子で区別する場合もあればそうでない場合もある。なお、Windowsでは以前のMS-DOSからの習慣で拡張子は3文字という習慣がいまだに残っていたりする。

なお、UNIXでは(macOSでも)ファイル名中に複数のピリオドが含まれていても構わない。拡張子として識別されるのは一番最後のピリオド以降となる。

Finderの初期設定では拡張子を表示しない設定になっているため、Finderで表示されるファイル名とターミナルで表示されるファイル名が食い違うことが起こる。初心者向けには拡張子を隠す方が都合がよいのだろうが、技術を学ぶ上では不都合なので、Finderの設定を変更しておくべきである。「Finder/環境設定…」メニューを選ぶと開く設定ウィンドウ中の「詳細」タブに拡張子を表示するスイッチがある。

隠しファイル

ピリオドから始まるファイル名は特殊で、通常の方法では表示されない隠しファイルとなる。そのような名前を付けてもファイルは確実に存在する。隠しファイルは、普段は操作する必要の少ない設定ファイルなどによく使われている。macOSのFInder上では.で始まる名前はつけられないようになっているが、ターミナルで操作するとそのような名前を付けることができる。エディタなどでうっかり.で始まる名前をつけてしまって慌てないように。

ファイル名を表示してみる

ファイル名一覧を確認するコマンドとしてls (LiStのls)がある。

練習 新しいターミナルウィンドウを開き、lsコマンドでファイル名一覧を表示させてみよう。

例えば次のような表示になる。

% ls
Desktop     Downloads   Movies      Pictures
Documents   Library     Music       Public
%

自分で作成したファイルがあったりするとこの通りとは限らない。また、自分で作ったファイルが無くても、最初から作られているファイルが存在する。

実は、ここで表示されているDesktopやDownloadsなどは通常のファイルではなく、後述するディレクトリである。

Finderで新しいウィンドウを開き、その内容とターミナルでのlsの表示結果とを見比べてみよう。Finderは日本語表示になっているので、自動的に名前を変換して表示しているが実体は同じものである。つまり、ターミナルとFinderではユーザにとっての見え方や操作方法こそ違っているが、扱っているファイルは同じものである。

隠しファイルを表示するにはlsコマンドに-aオプションを付ける。下記の実行結果は使用状況によって異なるかもしれない。

% ls -a
.			.zsh_sessions		Movies
..			Desktop			Music
.CFUserTextEncoding	Documents		Pictures
.Trash			Downloads		Public
.zsh_history		Library
%

.と..は実在のファイルではなく特殊な表記法である。これらの意味は後述する。

ファイルの詳細情報を表示するには-l(エル。longの意味)オプションを付ける。例えば次のような表示になる(一部のみ表示、実行結果は人によって異なる)。

% ls -l
total 896
drwx------@  15 mmina  staff     510  3 20 19:05 Desktop
drwx------+  18 mmina  staff     612  3  3 11:38 Documents
drwx------+ 110 mmina  staff    3740  3 17 17:19 Downloads
-rw-rw-r--@   1 mmina  staff    2936  3 11 18:09 Finalwork.c
drwx------@  58 mmina  staff    1972  1 21 12:07 Library

この表示形式の見方は次の通り。赤字の項目はよく使うので覚えておこう。

ファイルを作成してみる

コマンドでのファイルの扱いを練習するために、試しに1つファイルを作ってみよう。ファイルを作るには様々な方法があるが、ここではコマンドの紹介を兼ねてやってみる。

scriptコマンドは、ターミナル上で表示された文字をファイルに記録するコマンドである。scriptコマンドは引数に、記録するファイル名を指定する。

script ファイル名

本演習資料で、上のように水色の背景色で書いている部分は文法(書き方の規則)を説明している。このとおり書け、ということではないことに注意。

試しにtestという名前のファイルに記録してみよう。

注意!! scriptコマンドで指定したファイル名と同じ名前のファイルが既に存在していると、上書きして消してしまう。重要なファイルを消してしまわないように、存在しないことを確認してから実行しよう。

% script test

すると、scriptコマンドのメッセージが次のように表示されてプロンプトに戻る。

% script test
Script started, output file is test
% 

何も起こっていないように見えるがメッセージで"Script started"と表示されているように、これで記録が開始されている。

実はプロンプトの表示が変化している。←zsh環境では変化しなくなりました

幾つかコマンドを実行してみよう。

練習 scriptコマンドを実行して記録を開始し、date, cal, whoamiコマンドを順番に実行してみよう。whoamiコマンドが何を表示するコマンドか考えて調べてみよう。

scriptコマンドの記録を終了するにはexitと入力する。次のようなメッセージが表示され、記録が終了したことが通知される。

% exit
Saving session...
...saving history...truncating history files...
...completed.

Script done, output file is test
% ▌

練習 exitで記録を終了し、testという名前のファイルができていることをlsコマンドで確認しよう。

scriptコマンドはコマンドの操作結果を記録したいときなどに使える。

ファイルの内容表示

先ほどscriptコマンドで作成したファイルの内容を表示してみよう。内容を表示させるにはcatコマンド(concatenate 連結するの意)を使う。引数には表示させるファイル名を与える。

cat ファイル名

catコマンドは名前の通り本来は複数のファイルを連結する目的のコマンドであるが、単に表示するだけのためにもよく使われる。なお、catコマンドで表示できるファイルはテキストファイル、つまり表示可能な文字のみが含まれるファイルである。ファイルには文字として表示できない数値が含まれているもの(バイナリファイルとも呼ばれる)もあり、catコマンドで表示させようとすると表示がおかしくなることがある。

先ほど作ったファイル名がtestなら次のようになる。

% cat test

練習 上記のコマンドでファイルtestの内容を表示させよう。

長いファイルの内容表示

catコマンドはファイルの内容を全部、一気に表示してしまうので、ファイルの内容が多すぎると読みにくいかもしれない。そのような場合、moreコマンドを使うとよい。moreコマンドはウィンドウに収まる量だけ表示し、キー操作で続きに切り替えたり前の部分に戻すことができる。moreコマンドの引数には表示させたいファイル名を与える。閲覧のためのキー操作はmanと同じである。

moreコマンドの拡張版であるlessコマンドというのもある。

% more test

練習 上記のコマンドでファイルtestの内容を閲覧しよう。

また、ファイルの冒頭だけちら見するのでよい場合にはheadコマンドというのもある。

基本的なファイル操作

ファイルを扱っていると、名前を変えたい、複製したい、削除したい、といったファイル操作の必要が出てくる。これらを行うためのコマンドを説明する。

ファイル名の変更

ファイル名を変更するにはmvコマンド(move)を使う。

mv 元のファイル名 変更後のファイル名

練習 先ほど作成したtestというファイルをlogというファイル名に変更せよ。ちゃんと変更できたかlsコマンドで確認すること。

変更後のファイル名と同じ名前のファイルが既に存在する場合でも、強制的に変更してしまい、元々あったファイルは消えてしまうので注意。

-nオプションを付けると上書きしないようにできる。-iオプションを付けると上書きするか聞いてくるようにできる。

ファイルの複製

あるファイルを、別の名前で同じ内容のものに複製するにはcpコマンド(copy)を使う。

cp 元のファイル名 複製するファイル名

練習 先ほど名前を変更したファイルlogをlog2に複製せよ。ちゃんと複製できたかlsコマンドで確認すること。

複製後のファイル名と同じ名前のファイルが既に存在する場合でも上書きしてしまい、元々あったファイルは消えてしまうので注意。

cpコマンドもmvと同じように、同じ名前のファイルを上書きしてしまう。-nや-iオプションも同様に用意されている。

ファイルの削除

不要になったファイルを削除するにはrmコマンド(remove)を使う。

rm 削除するファイル名

練習 先ほど複製したファイルlog2を削除せよ。ちゃんと削除できたかlsコマンドで確認すること。

rmコマンドで削除すると即座にファイルが無くなるので要注意(Finderのように一旦ゴミ箱に移動されるという救済措置はない)。うっかりファイル名を間違ったりしないように気をつけよう。

最近ではディスク容量が十分豊富なのでファイルを消さないという方針も可能であるが、ゴミのようなファイルがいっぱいできると管理に困るし、ディスク容量は有限なので適当に削除するのがよいかもしれない。

コマンドとFinderでの操作

以上のファイル名の変更、ファイルの複製、削除といった操作は当然Finderでもできるし、生まれたときからGUIが普及していた諸君にとってはGUIで操作する方が慣れているだろう。しかし、大量のファイルをまとめて操作する、ネットワークを介して遠隔操作する、といった用途にはコマンドの方が効率が良いし(場合によってはコマンドを使わざるを得ない)、プログラミング作業をしている最中にもいちいちFinderに戻って操作するよりもターミナル上で操作する方が早かったりする。

必要に応じて使い分けるのがベストであるが、使わないものは覚えないのも事実なので、本演習では修行だと思って極力コマンド操作を使って欲しい。

ファイル操作の練習問題

練習 次の手順でファイル操作せよ。
1. scriptコマンドでtestという名前のファイルに記録を開始する
2. dateとlsコマンドを連続して実行する
3. exitとタイプしてscriptコマンドの記録を終了させる
4. testというファイルが作成されたことを確認する
5. testの内容を表示させて確認する
6. ファイルtestをlogに名前を変更する(上記の練習で既にできているが上書きして構わない)
7. testがlogに変更されたことを確認する
8. ファイルlogをlog2にコピーする
9. ファイルlog2が作成されたことを確認する
10. ファイルlog2の内容を確認してlogと同じであることを確かめる
11. ファイルlogとlog2を削除する

ヒント:ここまでの説明のとおり。

ディレクトリ

ファイルが沢山になると分類して整理する必要が出てくる。そのための「入れ物」がディレクトリdirectoryである。

directoryは元来は名簿、案内版といった意味。整理して目的のファイルを探しやすくするということでこのような名前が付けられた。
FinderなどのGUIではフォルダfolderという名称のファイルの入れ物があるが、実体はディレクトリと同じで、一般ユーザに分かりやすいように例えで表現したものである。元々、フォルダとは書類をまとめて整理する紙ばさみのことで、ファイルを書類で表したことに対応している。

例えば、lsコマンドで表示された、

% ls
Desktop     Downloads   Movies      Pictures
Documents   Library     Music       Public
%

これらはシステムで最初から用意されているディレクトリで、それぞれ名前の通り、書類を入れておくディレクトリ(Documents、Finderでは「書類」と表示される)、写真を入れておくディレクトリ(Pictures、Finderではピクチャ)、音楽ファイルを入れておくディレクトリ(Music、Finderではミュージック)などがある。また、デスクトップ(ウィンドウに属さない背景画面上)にファイルを置くことができるが、実体はDesktop(Finderではデスクトップ)というディレクトリで管理されている。

注意:これらのディレクトリの名前は変更してはならない。Finderやこれらのディレクトリにあるデータを使うアプリケーションの動作がおかしくなる可能性が高い。

ディレクトリは自分で作成することもでき、ファイル名と同様のルールで自由に名前をつけることができる。整理することが目的なので、関連するファイルをまとめて入れておくことを想定して適切な名前を付けるのがよいだろう。

例えば「レポート」「実験データ」「プログラム」を分けて次の図のように整理してみる(図中、□はディレクトリ、○はファイル)。

あるいは、授業ごとに分類すると次のようになるかもしれない。どちらがよいということでもなく考え方次第なので、探しやすさに考慮して適切に分ければよい。

ディレクトリの中にディレクトリを作成することもできる。古来より、大量のものを整理するために、大分類→中分類→小分類と分類するレベルを段階的に細かくしていく方法が使われている。例えば住所の場合、「京都府京都市北区上賀茂本山」は「京都府」の「京都市」の「北区」の「上賀茂本山」というように段階的に細かく分類している。このような分類法を階層的分類と呼ぶ。また、階層的分類になっている構造を階層構造と呼ぶ。

練習 階層的分類の例を挙げてみよう。

階層的分類とすれば、先ほどの例は授業ごとに分類し、さらにそれぞれでレポート、実験データ、プログラムと分けて整理するのがよいかもしれない。

練習 そのように整理すると、どのような構造になるか考えてみよう。上記の例ではファイル数が少ないが、もっと沢山あることを想定すること。

UNIXファイルシステムツアー

UNIXシステムは膨大なファイルで構成されている。ディレクトリを使ってどのように整理分類されているか見てみよう。

練習 以下で説明するコマンド操作を自分でもやってみよう。

ファイル一覧を表示するコマンドはlsであるが、この一覧で表示するのは、ターミナル(シェル)で作業中のディレクトリ(working directory)に入っているファイルである。シェルでは、常にどこかのディレクトリで作業している、という考え方をする。作業中のディレクトリはカレントディレクトリcurrent directoryとも呼ばれる。カレントディレクトリを移動するにはcdコマンド(change directory)を使う。

cd 移動先のディレクトリ名

移動先のディレクトリ名の指定方法はちょっと複雑なので、後でもう一度整理して説明することにする。まずは例の通りやってみてほしい。

まず、階層の最上位に移動する。ファイルシステムの階層の最上位を表す記号として、/(スラッシュ)が使われる。次のコマンドで移動する。

% cd /

ちゃんと移動できたか確認してみよう。カレントディレクトリを表示するにはpwdコマンド(print working directory)を使う。pwdコマンドには引数は必要ない。

% pwd
/
%

/と表示されなかったらcdの操作を間違えているので、cd /からやり直そう。

/に移動できたら、そこにあるファイルを表示させてみる(使用状況によっては若干違うかもしれない。以下同様)。

% ls
Applications        etc
Library             home
Network             installer.failurerequests
System              net
Users               private
Volumes             sbin
bin                 tmp
cores               usr
dev                 var
%

どれがディレクトリでどれが普通のファイルか区別がつかないので、lsに-Fオプションを付けてみよう。すると、ディレクトリには名前の最後に"/"が付いて表示される。

% ls -F
Applications/       etc@
Library/            home/
Network/            installer.failurerequests
System/             net/
Users/              private/
Volumes/            sbin/
bin/                tmp@
cores/              usr/
dev/                var@
%

名前の後に@が付いているものは、別の場所にある実体を参照しているシンボリックリンクという特殊なファイルである(GUIではエイリアスなどと呼ばれるものと同じ)。どこを参照しているかは、ls -lとすると表示される(lsコマンドに-lオプションを付けると詳細表示モードになる)。

幾つか代表的なディレクトリの内容を説明しておこう。

/bin 基本的なコマンドが置かれている
/dev デバイスファイルと呼ばれる、装置との入出力に使われるファイルが置かれている
/sbin システムが使用する基本的なコマンドが置かれている
/tmp システムが一時的に使用するファイルが置かれている(temporary)
/usr ユーザが使用するコマンドなどのファイルが置かれている
/Applications Macのアプリが置かれている(macOS独自)
/Users 各ユーザのファイルの置き場所(macOS独自)
/Volumes 起動ディスク以外の記憶媒体(USBメモリなど)はこのディレクトリの下に配置される(macOS独自)

/usrの中も見てみよう。カレントディレクトリをusrに移動して、その中にあるファイルを表示する。cdコマンドはディレクトリ名だけ指定すると、そのディレクトリに移動できる。

% cd usr
% pwd
/usr
% ls -F
X11/        include/    local/      standalone/
X11R6@      lib/        sbin/
bin/        libexec/    share/
%

さらにbinに移動してファイルを表示してみよう。

% cd bin
% pwd
/usr/bin
% ls -F
2to3*               mib2c-update*
2to3-*              mig*
2to3-2.7@           mkbom*
(途中省略)
memory_pressure*    zmore*
mesg*               znew*
mib2c*              zprint*
%

pwdで表示される、/usr/binという表記は、階層の最上位である/の下の、usrの下の、binという意味である(途中の/は区切りを表している)。また、ls -Fでファイル名に*が付いているものは実行可能なファイル、すなわちコマンドであることを表している。/usr/binはコマンドの置き場所で、ここだけで1000個以上のコマンドが存在している。

もう一つ、別の場所に移動してみよう。/Usersにカレントディレクトリを移動して、その中にあるファイルを表示してみよう。/を付けてディレクトリ名を書くと、最上位の階層の中のUsersを指定したことになる。

% cd /Users
% pwd
/Users
% ls -F
Guest/  Shared/ mmina/
%

最後の"mmina"の部分は全員異なっているはずで、自分の名前あるいは最初にMacを設定したときに決めた名前になっているだろう。これらのディレクトリはユーザごとのファイルの置き場所になっている。UNIXは複数のユーザが1台のコンピュータを共用する際に、ファイルの持ち主が分からなくなったり、他の人には見えないようにするためにユーザごとに置き場所が作られる。ちなみにGuestは一時利用者用、Sharedはユーザ間で共有するファイルの置き場所になっている。

/Usersを使用するのはmacOSの独自仕様で、多くのUNIXでは/home以下がユーザの独自ファイルの置き場所となっている。macOSでも/homeが残っているが実際には使われていない。他、macOS独自のディレクトリは区別しやすいように大文字で始まる名前になっているようである。

最後に自分の名前のディレクトリに移動しよう。これで最初のディレクトリに戻ったことになる。cdコマンドの引数は自分の名前のディレクトリを指定すること。自分の名前のディレクトリ名が長い場合は先頭の2、3文字を入力してtabキーを叩くとファイル名が補完されるので活用するとよい。

% cd mmina
% pwd
/Users/mmina
%