階層ファイルシステム

12.2. 階層ファイルシステム

コンピュータが管理するすべてのファイルから,1つのファイルを特定するにはどのように考えれば良いでしょうが?

例として,GUIで表示された フォルダで 1.txt というファイルを消す処理を考えます. ここで,1.txtという同じ名前のファイルが複数あった場合に,どのファイルが消えるでしょう?

ファイルを特定する パス について,確認しましょう.コンピュータと人が共通の理解をするための表現です. パスは,フォルダとフォルダ,あるいはフォルダとファイルの親子関係から定められます.

フォルダと親子関係 #

ファイルやフォルダが置かれている場所を と考えます.

例として,macOS や MS Windows での,ユーザのホームフォルダ Home を考えます.通常 Downloads (ダウンロード) や Desktop などいくつかのフォルダが用意されています.

HomeDownloads の関係は,Home が親で Downloads が子です.同様に,HomeDesktop の関係は,Home が親で Desktop が子です.親子関係を,親を左に子を右にまとめて,右図のように模式的に表します.

Home は,Downloads, Desktop, Music, Pictures を含む,という集合と包含のように理解することもできます.

Home
├── Desktop
├── Downloads
├── Music
└── Pictures

Downloads フォルダの中に,Schedule.pdftest.pdf があったとします.

この親子関係も同様に右図のように表せます.

Downloads は,Schedule.pdf, test.pdf を含む,という集合と包含のように理解することもできます.

Downloads
├── Schedule.pdf
└── test.pdf

親子関係全体をまとめてみましょう.

Schedule.pdfHome に含まれると,図から読みとれます. Home の親から見た Schedule.pdf のパスを,

Home/Downloads/Schedule.pdf

と書きます.Schedule.pdf までの親子関係を / でつなげたものです.

Home
├── Desktop
├── Downloads
│   ├── Schedule.pdf
│   └── test.pdf
├── Music
└── Pictures

これまでに紹介したパスは,目的のファイルが同じでも,どのフォルダから出発するかで変わります. この依存性を強調して, 相対パス とも呼びます. また,出発地点,つまり現在着目しているフォルダのことを,カレントフォルダ, または,カレントディレクトリー と呼びます.

フォルダは、注目する親子関係に応じて、親と呼ばれるか子と呼ばれるか変化します。 またあるフォルダ内のファイルやフォルダを、親フォルダが共通なので、兄弟姉妹 (sibling) に例えることもあります。
Linux や macOSなど は,区切り文字にスラッシュ / を使います.Microsoft Windows などでは,バックスラッシュ \ を使います.日本ではさらに歴史的な経緯で,円マーク ¥ が区切りになることがありますが,これは一種の文字化けで国際標準ではありません.

兄弟 #

同じ親を持つファイルやフォルダを 兄弟 (sibling) と呼ぶことがあります. 上記の例では,DownloadsDesktop は兄弟です.Schedule.pdftest.pdf も兄弟です. Musictest.pdf は兄弟ではありません.

入れ子構造 #

コンピュータがファイルを管理する機能を総称して,ファイルシステムと呼びます。 文脈によって,特定の計算機が管理するファイル群を含めて,ファイルシステムと呼ぶこともあります.

例で見たように,現代のファイルシステムでは,フォルダの中にフォルダをいれて、 入れ子構造にすることもできます。 何段階もフォルダを作れるファイルシステムを,階層ファイルシステムと呼びます.

絶対パス #

ユーザが作成したファイルやフォルダは,必ず親を持ちます. あるファイルを出発点に,親をたどり続けるとどこに行き着くでしょうか? 多くのファイルシステムでは,管理するすべてのファイルの共通の先祖であるフォルダ として ルート / を,(仮想的に)設定します.ルートはファイルシステムに1つだけあります.

ルートは,木の根 root です.「情報」では,木のモデルで様々な対象を理解しますが,ルートはいろいろなところで出てきます.

ルートから順にフォルダ名を 区切り文字 / で区切ってつなげること,操作対象のファイルやフォルダは特定できます. ルートから始めたパスを 絶対パス (path) と呼びます.

ファイルの集合について考えると,あるコンピュータが管理するファイルすべては,ルート / 以下のどこかにあります. つまり,ルートには 全体集合 が対応します.絶対パスに含まれるフォルダを左から一つずつたどると,そのフォルダに含まれるかどうかで集合が分割されて候補が少なくなり,最終的にはファイル名で特定されると理解できます.

Colab のファイルブラウザでは,絶対パスを簡単に調べることができます. ファイルを一つ選択後に,右クリックから Copy path を選びましょう. それを適当なところにペーストします. 右図の例なら,/content/sample_data/california_housing_test.csv がペーストされるでしょう.

今表示しているフォルダは,(実は) /content という絶対パスを持ちます.

他の環境でも,Finder や エクスプローラの ファイルアイコンは,絶対パスと紐付いています. 普段は隠されている環境もありますが,ターミナルにドラッグ・アンド・ドロップすると,ペーストされます. /home/user/Downloads などのように,絶対パスは /home などから始まるでしょう.

14.5. 便利な利用法

手順は先の章で紹介します

参考: ドライブレター
Microsoft のOSなど,C: のような文字列をルートの代わりのように使う文化もあります (昔は A: がフロッピーディスク,C: がハードディスクなどと割り当てられていました).これらはドライブレターと呼ばれています. このようなファイルシステムでもすべてのファイルはどこかのドライブの中にありますから, A:\readme.txt なら /A/readme.txt と読み替えると,木構造として理解できます. つまり,仮想的な / の下に /C//A/ があるのだが,省略記法として A: などがあると解釈します.

Tree コマンド #

tree は,木構造を表示するコマンドです.

Colab
演習中のシートの後半に進んでください.apt install tree を含むセルがあるので実行します. HWB-directory.ipynb

11. Colabとファイル操作

Chromebook端末
端末を開いて apt install tree として実行してください

macOS
brew install tree でインストールできます.前提として homebrew が必要です.

22.7. Homebrew

右の模式図は colab での実行例です.木の根 (左端) にあるフォルダ . はカレントディレクトリを意味します. 左のサイドバーにあるファイルブラウザの表示と比較して,一致を確認しましょう.
tree
.
└── sample_data
    ├── anscombe.json
    ├── california_housing_test.csv
    ├── california_housing_train.csv
    ├── mnist_test.csv
    ├── mnist_train_small.csv
    └── README.md

1 directory, 6 files

もし演習を進めていて Yggdrasil.zip を展開後なら表示は増えます
tree
.
├── sample_data
│   ├── anscombe.json
│   ├── california_housing_test.csv
│   ├── california_housing_train.csv
│   ├── mnist_test.csv
│   ├── mnist_train_small.csv
│   └── README.md
├── Yggdrasil
│   ├── lower
│   │   ├── Helheim
│   │   │   └── Eljudnir.txt
│   │   ├── Muspelheim
│   │   │   └── Gimli.txt
│   │   └── Niflheim
│   │       └── Hvergelmir.txt
│   ├── middle
│   │   ├── Jotunheim
│   │   │   └── Utgard.txt
│   │   ├── Midgard
│   │   │   └── Jormungandrs-Sea.txt
│   │   └── Svartalfheim
│   │       └── Nidavellir.txt
│   ├── README.txt
│   └── upper
│       ├── Alfheim
│       │   └── Alfheimr.txt
│       ├── Asgard
│       │   └── Valhalla.txt
│       └── Vanaheim
│           └── Noatun.txt
└── Yggdrasil.zip

14 directories, 17 files

path 指定 #

tree コマンドは調べたいフォルダのパスを指定することができます. Colab では sample_data を指定してみましょう.

Chromebook 端末や,BYODで演習する場合は,Downloads などを tree で表示してみましょう.
tree sample_data
sample_data
├── anscombe.json
├── california_housing_test.csv
├── california_housing_train.csv
├── mnist_test.csv
├── mnist_train_small.csv
└── README.md

0 directories, 6 files

tree は1ファイルに1行使います. 対象となるファイルが何千にもなると,tree の表示も肥大化するので気をつけてください. tree / のような操作は,colab では終わらないかもしれません. 木の深さを制限すると安全です.たとえば深さ1に制限するなら,tree -L 1 path とします.-L 1-L 2 にすれば,深さ2になります.
よく使うフォルダと操作 previous page 12.2. 階層ファイルシステム next page 情報の理解と活用
このサイトは開発版の はいぱーワークブック です.