資格道場 › レッスン一覧 › ソフトウェア
ソフトウェア・7/10・14分

ファイル・ディレクトリとシェル操作

ゴール

ルート・ホーム・カレントの3つのディレクトリと、絶対パス・相対パス(「.」と「..」)を区別して、パスの移動を自分でたどれるようになる。あわせて、アクセス権の8進数推定、ブロック割当てのセクタ数計算、アーカイバ・シェル・リダイレクト・パイプの用語問題を解けるようになる。

パスの移動やセクタ数の計算は、手順どおりに進めれば確実に1点取れる問題です。シェル・リダイレクト・パイプは、API の入出力をつなぐ感覚で理解でき、実務でサーバのログを読むときにもそのまま役立ちます。

このレッスンで稽古する(用語チェック・過去問)

結論:ディレクトリは3種類、パスは2種類

ファイルは**木の形(階層)**で管理されています。ディレクトリはフォルダのことです。試験で区別させられるのは次の3つです。

名前 意味 たとえ(会社のビル)
ルートディレクトリ システム全体の最上位。全員共通の根っこ ビルの正面玄関
ホームディレクトリ 利用者ごとに用意される自分用の最上位。普段のファイル保存はここから 自分に割り当てられた個室
カレントディレクトリ いま作業している場所。移動すると変わる いま立っている部屋

「一般の利用者がファイル保存に使う最上位」と聞かれたら答えはホームです。「最上位」という言葉につられてルートを選ばないようにしましょう。

絶対パスと相対パス

パスとは、ファイルまでの道順を書いたものです。どこを出発点にするかで2種類に分かれます。

種類 出発点 書き方の目印(試験の表記) 特徴
絶対パス ルートディレクトリ 先頭が「¥」 どこにいても同じ場所を指す
相対パス カレントディレクトリ 先頭が「.」「..」、またはディレクトリ名 今いる場所によって指す先が変わる
  • 「.」は今いるディレクトリ、「..」は1つ上のディレクトリを表します。
  • 試験ではUNIXの「/」の代わりに「¥」で区切ることが多いです。問題文の〔指定方法〕に必ず書かれているので、まずそこを読みましょう。
  • 「ホームディレクトリから」「カレントディレクトリから」と書かれた選択肢は、絶対パスの説明としては誤りです。

パス移動のトレース(最頻出)

本試験と免除試験で合わせて11回出ています。方法はひとつで、カレントの位置を紙に書き、1手ずつ更新するだけです。

3つのルール

  1. 「¥」で始まる → ルートからやり直す(それまでの位置は捨てる)
  2. 「..」→ 末尾のディレクトリを1つ消す
  3. 「.」→ 何もしない。ディレクトリ名 → 末尾に1つ足す

「..¥B」は「1つ上がってから B に入る」という2つの操作です。「¥」で区切った部品ごとに処理しましょう。

例として、¥A¥B → .. → ..¥B → .¥A の順に移動した場合(2009年秋)をたどります。

手順 操作 カレント
1 ¥A¥B(¥始まりなのでルートから) ¥A¥B
2 ..(1つ上) ¥A
3 ..¥B(上がって B に入る) ¥B
4 .¥A(今いる場所の下の A) ¥B¥A
flowchart TD
  R["ルート"] --> A1["A"]
  R --> B1["B"]
  A1 --> AA["A"]
  A1 --> AB["B(手順1)"]
  B1 --> BA["A(最終位置)"]
  B1 --> BB["B"]
ルート ¥¥A¥B¥A¥A¥A¥B¥B¥A¥B¥B1234丸の数字=その手順のあとのカレント位置....¥B.¥A1 ¥A¥B2 ¥A3 ¥B4 ¥B¥A
¥A¥B → .. → ..¥B → .¥A と移動したとき、各手順のあとのカレント位置を木の上に丸数字で示した図。どの箱にもルートからのパスを書いてあり、最終位置は ¥B¥A。

アクセス権の8進数(試行結果から推理する)

アクセス権は、ファイルを読む・書く・実行する権限のことです。3つの権限にそれぞれ1ビットずつ割り当てるので、3ビットで0〜7の数字1つにまとめられます。各ビットの値は4・2・1です。

この問題の要点は、どのビットがどの権限かを試行結果から推理することです。UNIXでは「4=読取り、2=書込み、1=実行」が一般的ですが、それを当てはめると間違えます(問題のビットの割当てが違うため)。

値 2進数 試行結果
0 000 何もできない
3 011 読取り・書込みはできるが、実行はできない
7 111 全部できる

3(2+1)で読取りと書込みができたので、2と1が読取り・書込みです。残る4が実行になります。どちらが読取りでどちらが書込みかはここからは決まりませんが、それでも答えは選べます。

3ビットの各ビットの値4213=2+1読取り・書込み(順は不明)残り=実行UNIXの「4=読取り」を当てはめると誤り
値3(2+1)で読取り・書込みができたので2と1がその2つ、残った4が実行だと推理する流れ。

ブロック単位の割当て(切り上げ計算)

ディスクはセクタ(読み書きの最小単位)に分かれています。ファイルはさらに、セクタをいくつか束ねたブロック単位で割り当てられます。たとえるなら、ケーキを1個だけ欲しくても、店が「8個入りの箱」単位でしか売らない状態です。

  • ファイルが小さくても、ブロック1つ分を丸ごと使います。使われずに余った部分を内部断片化といいます。
  • 計算の手順は、ファイルサイズ ÷ ブロックサイズを切り上げ → ブロック数 × 1ブロックのセクタ数、です。
  • 「空き領域が最大の媒体を選ぶ」タイプの問題は、各媒体の使用量を表にして1件ずつ足していけば解けます(例題参照)。
ファイルはブロック単位で割り当てるファイル使用ブロック1ブロック2余り=内部断片化点線の1マス=セクタ/太線=ブロックの境目切り上げたブロック数 × 1ブロックのセクタ数
ファイルは小さくてもブロック単位で割り当てられるので、最後のブロックで使われないセクタが内部断片化になる様子。

アーカイバ・シェル・リダイレクト・パイプ

アーカイバは、複数のファイルを1つにまとめたり、元に戻したりする道具です。バックアップや配布に使い、圧縮を伴うこともあります(zip など)。似た名前のユーティリティとの区別がよく問われます。

機能 すること
アーカイバ 複数ファイルを1つにまとめる・元に戻す
フォーマッタ ディスクにデータ領域と管理領域を作る
デフラグ 断片化したファイルを連続した領域に並べ直す
ダンプ 主記憶やレジスタの内容を一時的に別の装置へ書き出す
ミラーリング 同じデータを2台のディスクに書く

シェルは、利用者が入力したコマンドを解釈し、OSに実行を指示するプログラムです(コマンドインタプリタ)。受付窓口がお客さんの依頼を聞き取って奥の担当者に渡すイメージです。

機能 記号の例 つなぐ先
リダイレクト < 入力切替、> 出力切替、>> 追記 コマンド ⇔ ファイル
パイプ | コマンドの出力 → 別のコマンドの入力
  • リダイレクトは、入力も出力も切り替えられ、追記もできます。「〜はできない」と制限を付けた選択肢は誤りです。
  • UNIXはマルチユーザ・マルチタスクのOSで、入出力装置をファイルと同じように扱えます(デバイスファイル)。「ドライブ名:」で始まる絶対パスはWindowsの書き方です。
リダイレクト(コマンド⇔ファイル)ファイルコマンドファイル<>入力出力「>>」なら出力をファイルの末尾に追記パイプ(コマンド→コマンド)コマンド1コマンド2|コマンド1の出力をコマンド2の入力へファイルを介さずに直接渡す
リダイレクトはコマンドとファイルをつなぎ(< で入力、> で出力)、パイプは前のコマンドの出力を次のコマンドの入力へつなぐ。
例題 1

どの移動で ¥B¥A¥B に着くか(選択肢を1つずつたどる)

A,B という名の複数のディレクトリが,図に示す構造で管理されている。“¥B¥A¥B”がカレントディレクトリになるのは,カレントディレクトリをどのように移動した場合か。ここで,ディレクトリの指定は次の方法によるものとし,→は移動の順序を示す。 〔ディレクトリ指定方法〕 (1) ディレクトリは,“ディレクトリ名¥…¥ディレクトリ名”のように,経路上のディレクトリを順に“¥”で区切って並べた後に,“¥”とディレクトリ名を指定する。 (2) カレントディレクトリは,“.”で表す。 (3) 1 階層上のディレクトリは,“..”で表す。 (4) 始まりが“¥”のときは,左端にルートディレクトリが省略されているものとする。 (5) 始まりが“¥”,“.”,“..”のいずれでもないときは,左端に“.¥”が省略されているものとする。
ディレクトリ木(ルート直下に A, B。A と B それぞれの直下に A, B。さらにそれぞれの直下に A, B)。 ルート ├ A │ ├ A │ │ ├ A │ │ └ B │ └ B │  ├ A │  └ B └ B  ├ A  │ ├ A  │ └ B  └ B   ├ A   └ B

ア ¥A → ..¥B → .¥A¥B
イ ¥B → .¥B¥A → ..¥B
ウ ¥B → ¥A → ¥B
エ ¥B¥A → ..¥B

出典:平成29年度 春期 基本情報技術者試験 午前 問18

解き方と答えを見る
  1. ゴールは ¥B¥A¥B。各選択肢について、カレントを書きながら1手ずつ進める
  2. ア:¥A → カレント ¥A
  3. ア:..¥B → まず .. で ルート、次に B へ入って ¥B
  4. ア:.¥A¥B → 今いる ¥B の下の A、さらにその下の B へ進み ¥B¥A¥B。ゴールに一致する
  5. 念のため確認:イは ¥B → ¥B¥B¥A → ..¥B で ¥B¥B¥B。ウは ¥ 始まりが3回なので、最後の ¥B がそのまま答えになり ¥B。エは ¥B¥A → ..¥B で ¥B¥B

答え:ア

例題 2

相対パス .¥..¥..¥a¥b¥file を絶対パスに直す

絶対パス名 ¥a¥a¥b¥c をもつディレクトリがカレントディレクトリであるとき,相対パス名 .¥..¥..¥a¥b¥file をもつファイルを,絶対パス名で表現したものはどれか。ここで,ディレクトリ及びファイルの指定方法は,次の規則に従うものとする。 〔ディレクトリ及びファイルの指定方法〕 (1) ファイルは,“ディレクトリ名¥…¥ディレクトリ名¥ファイル名”のように,経路上のディレクトリを順に“¥”で区切って並べた後に“¥”とファイル名を指定する。 (2) カレントディレクトリは“.”で表す。 (3) 1階層上のディレクトリは“..”で表す。 (4) 始まりが“¥”のときは,左端にルートディレクトリが省略されているものとする。 (5) 始まりが“¥”,“.”,“..”のいずれでもないときは,左端にカレントディレクトリ配下であることを示す“.¥”が省略されているものとする。

ア ¥a¥b¥file
イ ¥a¥a¥b¥file
ウ ¥a¥a¥a¥b¥file
エ ¥a¥a¥b¥a¥b¥file

出典:平成21年度 春期 基本情報技術者試験 午前 問21

解き方と答えを見る
  1. 出発点(カレント)は ¥a¥a¥b¥c
  2. . → 何もしないので ¥a¥a¥b¥c のまま
  3. 1回目の .. → 末尾の c を消して ¥a¥a¥b
  4. 2回目の .. → 末尾の b を消して ¥a¥a
  5. a → ¥a¥a¥a、b → ¥a¥a¥a¥b、最後にファイル名を付けて ¥a¥a¥a¥b¥file

答え:ウ(¥a¥a¥a¥b¥file)

例題 3

試行結果からビットの割当てを推理する

ファイルの属性情報として,ファイルに対する読取り,書込み,実行の権限を独立に設定できる OS がある。この 3 種類の権限は,それぞれに 1 ビットを使って許可,不許可を設定する。この 3 ビットを 8 進数表現 0〜7 の数字で設定するとき,次の試行結果から考えて,適切なものはどれか。 〔試行結果〕 ① 0 を設定したら,読取り,書込み,実行ができなくなってしまった。 ② 3 を設定したら,読取りと書込みはできたが,実行ができなかった。 ③ 7 を設定したら,読取り,書込み,実行ができるようになった。

ア 2 を設定すると,読取りと実行ができる。
イ 4 を設定すると,実行だけができる。
ウ 5 を設定すると,書込みだけができる。
エ 6 を設定すると,読取りと書込みができる。

出典:平成27年度 春期 基本情報技術者試験 午前 問44

解き方と答えを見る
  1. 3 = 011(2+1)で読取りと書込みができた → ビット2とビット1が読取りと書込みを担当している
  2. 7 = 111 で全部できた → 残るビット4が実行
  3. ア:2 = 010 は読取りか書込みの片方だけ。実行は含まないので誤り
  4. イ:4 = 100 は実行だけ。正しい
  5. ウ:5 = 101 は実行+片方。書込みだけではないので誤り。エ:6 = 110 は実行+片方。読取りと書込みの両方ではないので誤り

答え:イ

例題 4

ブロック単位で割り当てたときのセクタ数

500 バイトのセクタ 8 個を 1 ブロックとして,ブロック単位でファイルの領域を割り当てて管理しているシステムがある。2,000 バイト及び 9,000 バイトのファイルを保存するとき,これら二つのファイルに割り当てられるセクタ数の合計は幾らか。ここで,ディレクトリなどの管理情報が占めるセクタは考慮しないものとする。

ア 22
イ 26
ウ 28
エ 32

出典:平成27年度 秋期 基本情報技術者試験 午前 問12

解き方と答えを見る
  1. 1ブロック = 500バイト × 8セクタ = 4,000バイト
  2. 2,000バイトのファイル:2,000 ÷ 4,000 = 0.5 → 切り上げて1ブロック = 8セクタ
  3. 9,000バイトのファイル:9,000 ÷ 4,000 = 2.25 → 切り上げて3ブロック = 3 × 8 = 24セクタ
  4. 合計:8 + 24 = 32セクタ
  5. よくある誤り:セクタ単位で計算すると 4 + 18 = 22 になる(ア)。ブロック単位で割り当てることを忘れない

答え:エ(32)

例題 5

空き最大の媒体に順に割り当てる

三つの媒体 A〜C に次の条件でファイル領域を割り当てた場合,割り当てた領域の総量が大きい順に媒体を並べたものはどれか。 〔条件〕 (1) ファイル領域を割り当てる際の媒体選択アルゴリズムとして,空き領域が最大の媒体を選択する方式を採用する。 (2) 割当て要求されるファイル領域の大きさは,順に 90,30,40,40,70,30(M バイト)であり,割り当てられたファイル領域は,途中で解放されない。 (3) 各媒体は容量が同一であり,割当て要求に対して十分な大きさをもち,初めは全て空きの状態である。 (4) 空き領域の大きさが等しい場合には,A,B,C の順に選択する。

ア A,B,C
イ A,C,B
ウ B,A,C
エ C,B,A

出典:基本情報技術者試験 科目A免除 修了試験 20180610 実施分 問18

解き方と答えを見る
  1. 初めは A=0、B=0、C=0(容量は同じなので、使用量が最小=空きが最大)
  2. 90:3つとも同じなので、優先順で A → A=90
  3. 30:B と C が同じなので B → B=30
  4. 40:C が最小 → C=40
  5. 40:B(30) が最小 → B=70
  6. 70:C(40) が最小 → C=110
  7. 30:A=90、B=70、C=110 なので B が最小 → B=100
  8. 結果は A=90、B=100、C=110。大きい順に C、B、A

答え:エ(C,B,A)

要点(試験直前に読む)

  • 保存に使う自分用の最上位はホーム、全体の最上位はルート、今いる場所はカレント(.)
  • 絶対パスはルートから、相対パスはカレントから。先頭の「¥」は「ルートからやり直し」の合図
  • パスの移動は位置を書きながら1手ずつ:「..」で1つ消す、名前で1つ足す。「..¥B」は2つの操作
  • アクセス権の問題は、試行結果からビットの割当てを決める(UNIXの4=読取りは当てはめない)
  • セクタ数は、ブロック単位で切り上げてから「× セクタ数」
  • アーカイバ=まとめる・戻す、シェル=コマンドを解釈、リダイレクト=ファイルとつなぐ、パイプ=コマンド同士をつなぐ

ひっかけ

  • 「最上位」という言葉でルートを選ばせる → 「一般の利用者が保存に使う」ならホーム
  • 絶対パスの説明に「ホームから」「カレントから」「最短の」を混ぜる → 正解は「ルートから」だけ
  • アクセス権でUNIXの常識(4=読取り)を使わせる → 問題文の試行結果だけで判断する
  • セクタ単位で切り上げた数(22など)を選択肢に置く → ブロック単位で切り上げてからセクタに直す
  • パイプとリダイレクトの入れ替え、リダイレクトに「追記できない」といった制限を付ける → コマンド同士ならパイプ、ファイルならリダイレクトで、入出力の切替も追記もできる

用語(17)

ルートディレクトリ るーとでぃれくとり
ファイルシステム全体の最上位にある、すべてのディレクトリの根っこ。
⚠ ホームディレクトリ:利用者ごとの最上位。「一般の利用者が保存に使う最上位」ならホーム
ホームディレクトリ ほーむでぃれくとり
利用者ごとに用意され、その人がファイルを保存する最上位のディレクトリ。
⚠ ルートはシステム全体の最上位、カレントは今いる場所
カレントディレクトリ かれんとでぃれくとり
いま作業している位置のディレクトリで、「.」で表す。
⚠ ホームディレクトリ:固定された自分用の場所。カレントは移動すると変わる
絶対パス ぜったいぱす
ルートディレクトリを出発点にして、対象ファイルまでの道順を書いたもの。
⚠ 相対パス:カレントが出発点。「ホームから」「最短の」は絶対パスの説明ではない
相対パス そうたいぱす
カレントディレクトリを出発点にして、対象ファイルまでの道順を書いたもの。
⚠ 先頭が「¥」なら絶対パス。「.」「..」やディレクトリ名で始まれば相対パス
..(親ディレクトリ) どっとどっと
1つ上の階層のディレクトリを表す記号。
⚠ 「.」は今いる場所で、移動しない
アクセス権 あくせすけん
ファイルに対する読取り・書込み・実行の許可/不許可を、1ビットずつで表した設定。
⚠ UNIXの一般的な割当て(4=読取り)を前提にせず、問題の試行結果から割当てを推理する
8進数 はっしんすう
0〜7で表す数で、2進数3ビット分(4・2・1)をちょうど1桁で表せる。
セクタ せくた
ディスクを読み書きするときの最小単位の区画。
⚠ ブロック:複数のセクタを束ねた、ファイルに割り当てる単位
ブロック ぶろっく
複数のセクタをまとめた単位で、ファイル領域はこの単位で割り当てられる。
⚠ 計算はセクタ単位ではなく、ブロック単位で切り上げる
内部断片化 ないぶだんぺんか
割り当てたブロックのうち、ファイルが使わずに余って無駄になる部分。
⚠ フラグメンテーション(外部の断片化):ファイルが飛び飛びの領域に散らばること。デフラグで解消する
アーカイバ あーかいば
複数のファイルを1つにまとめたり元に戻したりするユーティリティで、バックアップや配布に使う。
⚠ フォーマッタは領域作成、デフラグは再配置、ダンプは主記憶の書き出し、ミラーリングは二重化
シェル しぇる
利用者が入力したコマンドを解釈し、OSに実行を指示するプログラム(コマンドインタプリタ)。
⚠ ショートカット操作や排他制御の説明ではない
標準入力・標準出力 ひょうじゅんにゅうりょく・ひょうじゅんしゅつりょく
コマンドが既定で使う入力元(通常はキーボード)と出力先(通常は画面)。
リダイレクト りだいれくと
標準入力・標準出力の行き先をファイルに切り替える機能で、追記もできる。
⚠ パイプ:つなぐ先がファイルではなく、別のコマンド
パイプ ぱいぷ
あるコマンドの標準出力を、別のコマンドの標準入力に直接つなぐ機能。
⚠ リダイレクト:つなぐ先がファイル
デバイスファイル でばいすふぁいる
UNIXで、入出力装置を普通のファイルと同じように扱うための特別なファイル。

このレッスンの過去問

このレッスンで稽古する