Web Analytics Made Easy - StatCounter

工業大学生ももやまのうさぎ塾

4年間+2年間の工業大学・大学院で学んだ知識やためになることを投稿していきます

ファイルシステム 絶対パス・相対パスの違いって何?

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

 

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

(1) ファイル

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

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

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

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

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

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

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

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

そこで使うのがディレクトリです。ディレクトリに関連するファイルごとに分けて入れることができます。

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

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つ前のディレクトリを表す

今回はカレントディレクトリを 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/*

 みたいに打つことができます。このとき、上からコマンドの説明をすると
上:senディレクトリの中にあるexで始まり、.jpgで終わるファイルすべてを表します。例えば、ex1.jpg、ex2.jpg、ex200.jpgなど、exで始まり.jpgで終わるファイルすべてに該当します。

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

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

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

 

4.練習など

 では、絶対パスと相対パスに慣れてもらうために何問か練習をしてもらいましょう。
ファイルの位置は下のやつとします。

カレントディレクトリは、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 移動先

 

 

 

 

解答
(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:もちろんカレントディレクトリの場所は移動前と移動後で変わる