うさぎでもわかる計算機システム Part14 Unixのファイルシステム その1(絶対パス・相対パスの違い)

スポンサードリンク

こんにちは! ももやまです!

今回はプログラミングを学んでいる人は知らない人はいないであろうUnix (MacOS, Linux(Ubuntu, CentOS))、Windowsのファイルシステムについて、絶対パス・相対パスの違いを説明したいと思います。

 

前回の計算機システムの記事はこちら!

www.momoyama-usagi.com

スポンサードリンク

1.ファイル・ディレクトリ

まずはファイルとディレクトリの違いについて説明していきます。

(1) ファイル

ファイルを簡単に言うと書類です。

 

皆さん普段いろんなデータをPCに保存していますよね。
例えば、PDF、画像ファイル(.jpg,.png)、Wordで書いた企画書、レポート、Excelデータ、プレゼンファイル(.pptx)、テキストファイル(.txt)、他にもいろいろあります。

 

これらPC上で扱えるすべてのデータはファイルです。

(2) ディレクトリ(フォルダ)

ディレクトリを簡単に言うと、クリアファイルみたいな入れ物です。

 

皆さんは家や仕事場の机の周りはもちろん整理整頓しますよね。
しない人はする努力してください…

 

整理整頓をしないとどこに何があるのかがわからなくなるように、ファイルが増えてくるとどのファイルがどこにあるか全くわからなくなりますよね…

 

そこで、関連するファイルをテーマやカテゴリーごとにグループ分けして整理整頓したくなりますよね。

 

Unixにおいてファイルをグループ分けするものをディレクトリと呼びます。ディレクトリに関連するファイルごとに分けて入れることができます。

 

ディレクトリの中がごちゃごちゃしてきたらディレクトリの中にさらにディレクトリを入れて整理整頓することができます。

 

f:id:momoyama1192:20191207005506g:plain

スポンサードリンク

2.絶対パス・相対パスってなに?

ファイルの場所を表す方法には絶対パス・相対パスの2つがあります。2つの違いについて説明していきましょう。

 

1で説明したファイルやディレクトリが下の図のようになっているとします。今回の説明ではこれを使います。

f:id:momoyama1192:20190426101918j:plain

(1) 絶対パス

絶対パスは、ルートディレクトリ(始点)からの対象(目的地)までの経路を表します。

分かりやすく言うと住所と同じです。「福岡県北九州市戸畑区仙水町…」

ルートディレクトリとは、一番上位のディレクトリ、つまり出発点をあらわします。住所で例えると「日本」となります。

 

例えば、ramen.jpg というファイルの場所を絶対パスで表すとどうなるでしょうか。

ramen.jpg は fukuoka というディレクトリの中に入っていますよね。なので、この場合の絶対パス は

/fukuoka/ramen.jpg

となります。相対パスでも同じなのですが、UnixOSの場合ディレクトリやファイル名は / (スラッシュ)で区切っていきます(Windowsの場合は \ で区切る、コマンドプロンプト(Windows版ターミナル)でコマンドを入力するときは / (スラッシュ)でもOK)。

 

もう1つ例を出してみましょう。今度は takoyaki.jpg を探してみましょう。

 

takoyaki.jpg は osaka というディレクトリの中の kita ディレクトリの中に入っていますね。なので絶対パスは、

/osaka/kita/takoyaki.jpg

となります。

(2) 相対パス

ディレクトリ構造が複雑になると絶対パスを入力するだけでかなりめんどくさいですよね。近くのファミレス行くときに「今日さ、京都府京都市左京区田中門前町にあるサイゼリアに行かね?」なんて絶対に言いませんよね。「サイゼリア行かね?」で通じますよね。

 

相対パスは、カレントディレクトリ(現在地点)から対象(目的地)までの経路を表します。

 

カレントディレクトリは名前の通り、現在いる場所を表します。

 

相対パスでのみ使用される*12つのコマンド(?)を紹介します

 

その1:"."    カレントディレクトリを表す
その2:".."   1つ前のディレクトリを表す

 

今回はカレントディレクトリを usagi (/fukuoka/tobata/usagi) としましょう。

 

例えば usagi の中にある unsei.pdf を相対パスで表すとどうなるでしょうか。
usagi ディレクトリから見れば、unsei.pdf はディレクトリを一切経由せずにたどりつけますよね。なので、相対パスは、

./unsei.pdf

となります。

 

カレントディレクトリの (./) は基本的に省略OK*2なので

unsei.pdf

と表されることが多いです。

 

今度は takajo.jpg というファイルを相対パスを使って表してみましょう。
カレントディレクトリは先程と同じ usagi とします。

 

今回は、カレントディレクトリから1つ戻ってtobataの中のguntieディレクトリの中にtakajo.jpg がありますよね。なので相対パスは、

../guntie/takajo.jpg

となります。

たまに現在いる場所の住所が知りたくなったりするときってありますよね。Unixでは現在いる場所の絶対パスを表示させるコマンドがあります。絶対パスを知りたい人は次のコマンドを打ち込んでください、

pwd

すると絶対パスが表示されます。(Windowsの場合はcdと入力)

 

起動時に設定されるカレントディレクトリはホームディレクトリと呼びます。自宅みたいなもんです。

一般利用者にとってはホームディレクトリが一番最上位のディレクトリとなります。

 

スポンサードリンク

3.絶対パス・相対パスの長所短所

絶対パス・相対パスにはそれぞれ長所、短所があります。それでは説明していきましょう。

(a) 絶対パスが優れている点

(1) 誰が見ても絶対パスは変わらない

住所って自分がいる場所が北海道だろうが沖縄だろうが変わりませんよね

 

絶対パスも同じようにファイル自体を動かさない限りはカレントディレクトリの場所によって変化しません

 

なので他の人に場所を教えるときは絶対パスを使用します。

(b) 相対パスが優れている点

(1) 近い場所ならとにかく短い

上のほうで書きましたが、近くの場所を示すときに住所は使いませんよね。「京都府京都市左京区……の桃山の家で遊ぼうぜ!」なんて言わずに「桃山の家で遊ぼうぜ!」と言いますよね。カレントディレクトリが usagi の unsei.pdf のパスは、

 

絶対パス:/fukuoka/tobata/usagi/unsei.pdf
相対パス:unsei.pdf

 

長さが全然違いますよね。いちいち絶対パスを打ち込みたくありませんよね。しかし、相対パスのときが長くなってしまうときがあります。

 

例えば先程と同じくカレントディレクトリが usagi とし、 hiroshima というディレクトリのなかの miyajima.jpg までのパスは、

 

絶対パス:/hiroshima/miyajima.jpg
相対パス:../../../hiroshima/miyajima.jpg

 

となります。相対パスの場合、3回もディレクトリを戻らなければいけないため、../ というのを3回も書かなければならず大変です。

(2) お引越しをしても相対パスは変わらない

例えば usagi ディレクトリ(/fukuoka/tobata/usagi の中)を osaka ディレクトリの中に丸ごと移動させることを想定してみましょう。

 

カレントディレクトリをusagiとしたときのusagiフォルダの中にあるunsei.pdf までのパスは、

 

移動前絶対パス:/fukuoka/tobata/usagi/unsei.pdf
移動後絶対パス:/osaka/usagi/unsei.pdf
相対パス:unsei.pdf

 

このように、移動前後で絶対パスは変わっていますが相対パスは変わっていませんよね*3

usagiディレクトリ内にあるプログラムで、usagiディレクトリの中にあるファイルの場所を絶対パスで指定した場合は、すべて書き換えないといけないのですが相対パスだとそのままでOKなのでかなり楽です。

4.ワイルドカード

 ファイルを指定するときに名前がわからない…、とか複数のファイルを指定したい、っていうときがありますよね。そのときに便利なのが2つのワイルドカードです。

(1) ?

この文字を使うと ? 1文字を任意の1文字とすることができます。例えば、

/fukuoka/???.jpg
/fukuoka/iizuka/mizuki/kadai??.txt

 のようにできます。上のコマンドは、「fukuokaディレクトリの中にある3文字 + .jpg」となるファイルすべてを表します。例えば、abc.jpg、def.jpg などは当てはまりますが、hakata.jpgのように???.jpgに当てはまらないファイルは該当しません。

 

下のコマンドは、「mizukiディレクトリの中にあるkadai + 2文字 . txt」となるファイルすべてを表します。この場合は、kadai01.txt、kadai13.txtなどは該当しますが、kadai1.txt のようなファイルは kadai??.txt に当てはまらないので該当しません。

(2) *

この文字は、?と違って、すべての文字とすることができます。

 

例えば、

/fukuoka/iizuka/sen/ex*.jpg
/hiroshima/*carp.jpg
/fukuoka/tobata/usagi/*

 みたいに打つことができます。このとき、上からコマンドの説明をすると

 

上:/fukuoka/iizuka/sen/ex*/jpg

senディレクトリの中にあるexで始まり、.jpgで終わるファイルすべてを表します。例えば、ex1.jpg、ex2.jpg、ex200.jpgなど、exで始まり.jpgで終わるファイルすべてに該当します。

 

中:/hrioshima/*carp.jpg

carpディレクトリにある carp.jpg で終わるファイルすべてを表します。例えば、hiroshimacarp.jpg、hirocarp.jpg、114carp.jpg などが該当します。

 

下:/fukuoka/tobata/usagi/*

usagiディレクトリにあるすべてのファイルを表します。このように * 単体で打つとすべてのファイルやディレクトリを表すことができます。

個人的意見なのですが、? より * のほうを使う機会が多いように感じます…

 

4.練習問題

 では、絶対パスと相対パスに慣れてもらうために何問か練習をしてもらいましょう。

練習1~練習4はITパスポート・基本情報の過去問、練習5はUnixコマンドを用いた応用問題となっています。

練習1

UNIXの階層的ファイルシステムにおいて、アカウントをもつ一般の利用者がファイルの保存などに使う階層で最上位のものはどれか。

[基本情報技術者平成22年春期 午前問21]

ア:カレントディレクトリ
イ:デスクトップディレクトリ
ウ:ホームディレクトリ
エ:ルートディレクトリ

練習2

ファイルシステムの絶対パス名を説明したものはどれか。

[基本情報技術者平成26年秋期 午前問19]

ア:あるディレクトリから対象ファイルに至る幾つかのパス名のうち,最短のパス名
イ:カレントディレクトリから対象ファイルに至るパス名
ウ:ホームディレクトリから対象ファイルに至るパス名
エ:ルートディレクトリから対象ファイルに至るパス名

 

練習3

図に示す階層構造において、カレントディレクトリが*印のディレクトリであるとき,相対パス指定で ../../B/B によって指定したディレクトリと同じディレクトリを絶対パス指定したものはどれか。

f:id:momoyama1192:20191207005510g:plain

[ITパスポート平成26年春期 問68]

ア:¥A¥B¥B
イ:¥B
ウ:¥B¥B
エ:¥B¥B¥B

 

練習4

絶対パス名 /a/a/b/c を持つディレクトリがカレントディレクトリであるとき、相対パス ./../../a/b/file をもつファイルを絶対パス名で表現したものはどれか。

[基本情報技術者平成21年春期 午前問21]

ア:/a/b/file
イ:/a/a/b/file
ウ:/a/a/a/b/file
エ:/a/a/b/a/b/file

 

練習5 応用 Unixコマンドと絶対パス・相対パス

カレントディレクトリは、fukuoka とします。つぎの(1)~(7)の指示に合うようなコマンドを書きなさい。

ただし、ファイルの位置は以下のように与えられる。

f:id:momoyama1192:20190426101918j:plain

(1) tokyoディレクトリの中にあるtmp.txtの中身を表示するコマンドを絶対パスで入力しなさい。
(2) iizukaディレクトリの中身を確認するコマンドを相対パスで入力しなさい
(3) このとき、mizukiディレクトリに入っている excali.jpgをsenディレクトリへ移動するコマンドを相対パスで書きなさい。ただし、移動後に
(4) このとき、カレントディレクトリをsenに変更するコマンドを絶対パスで入力しなさい。 

ここから先はカレントディレクトリをsenとする。

(5) guntieディレクトリにあるtakajo.jpgを自分のカレントディレクトリ(sen)にコピーするコマンドを相対パスで入力しなさい。コピー前後で名前が変わらないようにすること。
(6) mizukiディレクトリにある .txt で終わるファイルすべてをiizukaディレクトリに移動するコマンドを相対パスで入力しなさい。コピー前後で名前が変わらないようにすること。
(7) ユーザー名がseikyoのホームディレクトリにあるyosanディレクトリを nagoya ディレクトリの中にコピーするコマンドを絶対パスで入力しなさい。

 

ヒント1:

ユーザー名 sample のホームディレクトリは、

~sample

 と表します。

ヒント2:Unixコマンド一覧表 

cat コマンドは、次のように指定することでファイルの中身を表示することができる。

cat 参照ファイル

 ls コマンドは、次のようにディレクトリを指定することで、ディレクトリの中身を確認することができる。

ls 参照ディレクトリ

mv コマンドは、次のようにファイルやディレクトリを指定することで、指定したファイルなどを移動させることができる。

mv 移動元ファイルorディレクトリ  移動先ファイルorディレクトリ

cpコマンドは次のように入力することでファイルをコピーすることができる。

cp 移動元ファイル 移動先ファイル

また、次のように入力することでディレクトリをコピーすることもできる。

cp -r 移動元ディレクトリ 移動先ディレクトリ

mv、cpコマンドは移動先のファイル名(、ディレクトリ名)を指定しない場合は移動元のファイル名(、ディレクトリ名)と同じ名前となる。

cd コマンドは次のように入力することでカレントディレクトリを変更することができる。

cd 移動先

  

5.練習問題の答え

解答1

解答:ウ

一般利用者にとっての最上位のディレクトリはホームディレクトリです。

 

ルートディレクトリと間違えないようにしましょう!

(ルートディレクトリは一般利用者が使用することはほぼありません。)

 

解答2

解答:エ

絶対パスとは、ルートディレクトリからの対象までの経路でしたね。なので答えはエとなります。

(ちなみに相対パスの説明はイの「カレントディレクトリからの経路」となります。)

 

解答3

解答:エ

カレントディレクトリは下の赤で囲われた場所ですね。

そこから、相対パスを1つずつたどっていきましょう。

 

すると、緑色で囲われた部分にたどり着きますね。

この部分を絶対パスで表すと /B/B/B となりますね。

 

よって答えはエとなります。

f:id:momoyama1192:20191207005515g:plain

 

解答4

解答:ウ

カレントディレクトリ(/a/a/b/c)から指されている相対パス ./../../a/b/file を実際に下のような図を書いてどこになるかを当てはめてみましょう。

f:id:momoyama1192:20191207005502g:plain

すると、緑で囲われた部分が file になりますね。

その部分の絶対パスは /a/a/a/b/file なので、答えはウとなります。

 

解答5 応用 Unixコマンドと絶対パス・相対パス

答えは下のようになります。

(1) cat /tokyo/tmp.txt
(2) ls iizuka
ls ./iizuka
(3) mv iizuka/mizuki/excali.jpg iizuka/sen/excali.jpg
mv iizuka/mizuki/excali.jpg iizuka/sen/
(4) cd /fukuoka/iizuka/sen
(5) cp ../../tobata/guntie/takajo.jpg .
cp ../../tobata/guntie/takajo.jpg ./
(6) mv ../mizuki/*.txt ..
mv ../mizuki/*.txt ../
(7) cp -r ~seikyo/yosan /nagoya/
cp -r ~seikyo/yosan /nagoya/yosan

 

5.さいごに

今回はファイルシステムについて、特に絶対パス、相対パスについてまとめてみました。Unixを使う人やプログラミングをする人にとっては絶対に必要な知識なのでぜひ覚えておきましょう! ではまた次回。

*1:一応絶対パスでも使えるが、わざわざ使う人はいない。住所言うときも「大阪府吹田市1つ戻って吹田市山田丘」みたいなこと言う人いませんよね…

*2:お使いの端末の設定による

*3:もちろんカレントディレクトリの場所は移動前と移動後で変わる

関連広告・スポンサードリンク

おすすめの記事