「あれっ、cd コマンドで移動したいのに、そんなファイルはないって言われちゃった!?」
「ls を実行しても、目的のファイルが全然表示されない…(涙)」
「スクリプトを実行したら、ファイルが見つからないってエラーが出た!なんで〜!?」
Linuxを学び始めたばかりのとき、私、まさにこんな状態でした…。
Windowsのフォルダ感覚で操作していたら、もう、頭の中がハテナマークでいっぱいに!
🍀「絶対パスと相対パスって、一体なにが違うの!?」
🍀「linux 相対パスって、どうやって指定すればいいの…?」
🍀「linux ホームディレクトリってよく聞くけど、それって何?」
🍀「ターミナルに出てる、あのナゾの「~(チルダ)」って一体なんなの!?」
もう、どこを見ていいかわからなくって!
きっと今、このページにたどり着いたあなたも、まったく同じ不安と焦りを抱えていらっしゃるのではないでしょうか?
わかります!その気持ち、痛いほどわかります!
これらの問題の9割は、「パス」の指定ミス、あるいは「絶対パス」と「相対パス」の違いを正確に理解していないことが原因だったんです…。
この記事は、そんなパニック状態だった「私」が、Linuxの「パス」の概念を徹底的に勉強して「あ、そういうことだったんだ!」とスッキリ解決するまでの全記録をまとめた、あなたのための「あんしん攻略ガイド」です🗺️✨
この記事を読み終える頃には、あなたはこんな状態になっているはずですよ!
- 絶対パスと相対パスの違いを、他人に説明できるレベルで完璧に理解している。
- 「linux 相対パス」を使ったファイル操作を、迷わず実行できる。
- 「linux ホームディレクトリ」の重要性と、「linux チルダ (
~)」の本当の意味がわかる。 pwd,cd,lsなどの基本コマンドが、なぜそのように動作するのかを根本から理解できる。- 「No such file or directory」というエラーメッセージに怯えなくなる。
Linuxを自在に操るための「地図の読み方」を、ここで一緒にマスターしていきましょうね!
Linuxにおける「パス」とは何か? なぜ必要なのか?
まず、最も基本的な概念から一緒に見ていきましょう♪
「パス(Path)」とは、ひと言でいえば「ファイルやディレクトリまでの道筋(住所)」のことなんです。
Windowsを使ったことがある方なら、「フォルダ」っていう概念に慣れていらっしゃいますよね。
C:\Users\YourName\Documents\report.xlsx
上記は、Windowsにおける「パス」の一例です。
Cドライブの中の、Usersフォルダの中の、YourNameフォルダの中の、Documentsフォルダの中にある、report.xlsxファイル…という「住所」を示しているんですね。
💻 Linuxの住所(パス)は「ツリー構造」
Linuxのファイルシステムも、この「住所」の考え方は同じなんですよ。
ただし!Windowsみたいに C:</code> や D:</code> といったドライブレターから始まるんじゃなくて、たった一つの「頂点」から始まるんです。
その頂点を「ルートディレクトリ」と呼んで、「/(スラッシュ)」という記号で表します。
すべてのファイルとディレクトリは、このルート「/」から枝分かれした「ツリー(木)構造」で管理されているんですね。
/ (ルートディレクトリ) ├── bin (コマンド実行ファイル) ├── etc (設定ファイル) ├── home (各ユーザーのホームディレクトリ) │ ├── user1 │ │ ├── documents │ │ └── pictures │ └── user2 ├── tmp (一時ファイル) └── var (可変データ、ログなど) └── log
例えば、上の図で user1 の documents ディレクトリの「住所(パス)」は、 「/ の中の home の中の user1 の中の documents」となります。
これをLinuxのパス表記で書くと、以下のようになるんです。
/home/user1/documents
このように、ディレクトリ(フォルダ)とディレクトリの間を / で区切って道筋を示すのが、Linuxの「パス」の基本なんですね!
最重要!「絶対パス」とは?(常に変わらない完全な住所)
パスには大きく分けて2種類あります。
その一つ目が「絶対パス(Absolute Path)」です。
絶対パスとは、必ず「/(ルートディレクトリ)」から始まる、完全な住所のことなんですよ。
/home/user1/documents/report.txt/etc/nginx/nginx.conf/var/log/syslog
これらはすべて絶対パスです。
📍 絶対パスの特徴:いつでも、どこからでも「絶対」に同じ場所を指す
絶対パスの最大の特徴は、その名の通り「絶対的」であることです!
あなたが今、Linuxシステムのどのディレクトリにいようとも、絶対パスで指定された場所は、常に「一意(ただ一つ)」に決まるんです。
例えば、あなたが /tmp ディレクトリにいようが、/home/user2 ディレクトリにいようが、ls /home/user1/documents というコマンドを実行すれば、必ず /home/user1/documents の中身が表示されます。
これが「絶対パス」なんですね。
ビルの住所(例:東京都渋谷区…)と同じで、自分が今どこ(例:大阪、北海道)にいようと、その住所が指すビルは常に同じである、と考えると分かりやすいかもしれませんね♪
🧭 絶対パスの使い所
絶対パスは、その「常に変わらない」という性質から、こんな場面でとーっても重要になります。
- 設定ファイルでのパス指定: プログラムが特定のファイル(ログファイル、設定ファイルなど)を読み込む際、実行場所に関わらず必ず同じファイルを指してほしい場合に絶対パスを使います。
- シェルスクリプト: 自動処理を行うスクリプト内で、実行時の「現在地」に依存せず、確実に特定のファイルやディレクトリを操作したい場合に使います。
- 確実な移動:
自分が今どこにいるか分からなくなっちゃった時でも、
cd /home/user1のように絶対パスを使えば、確実に目的の場所に移動できますよ。
頻出!「相対パス」とは?(今いる場所からの住所)
二つ目のパスが、初心者を最も混乱させる「相対パス(Relative Path)」です(泣)
相対パスとは、「/(ルート)」から始まらない、現在地(カレントディレクトリ)を基準にした住所のことです。
documents/report.txt../backup/config.cfg./script.sh
これらはすべて相対パスですね。
📍 相対パスの最重要概念:「カレントディレクトリ(現在地)」
相対パスを理解するための鍵は、「カレントディレクトリ(Working Directory)」です!
カレントディレクトリとは、あなたが「今、作業しているディレクトリ」のことなんですよ。
この「カレントディレクトリ(現在地)」は、pwd (Print Working Directory) というコマンドでいつでも確認できちゃいます。
[user1@hostname ~]$ pwd /home/user1
この場合、あなたのカレントディレクトリは /home/user1 ですね。
相対パスは、この pwd で表示されるカレントディレクトリを「基準」として、目的のファイルやディレクトリへの道筋を示します。
例えば、あなたが /home/user1 にいる時、
documents/report.txt
という相対パスは、
「カレントディレクトリ(/home/user1)の中にある documents ディレクトリの中にある report.txt ファイル」
を指すことになります。
つまり、絶対パスで書くと /home/user1/documents/report.txt と同じ意味になるんですね。
でも!ここがとーっても重要です!
もし、あなたが cd /tmp コマンドで /tmp ディレクトリに移動したとします。
[user1@hostname ~]$ cd /tmp [user1@hostname tmp]$ pwd /tmp
この状態で、先ほどと同じ documents/report.txt という相対パスを指定すると、どうなると思いますか?
今度の基準(カレントディレクトリ)は /tmp です。
したがって、システムは
「/tmp の中にある documents ディレクトリの中にある report.txt ファイル」
を探しに行ってしまうんです!
もし /tmp/documents/report.txt というファイルが存在しなければ、「No such file or directory(そんなファイルやディレクトリはありません)」という、あのイヤ〜なエラーが返ってきちゃいます(泣)
このように、相対パスは「カレントディレクトリ(現在地)」によって、指し示す先が変わってしまうんです。
これが「相対的」と呼ばれる理由であり、初心者の私たちが「さっきは動いたのに、今度は動かない!」と混乱しちゃう最大の原因だったんですね。
🧭 相対パスで使われる特殊な記号
相対パスを使いこなすには、2つ(厳密には3つ)の特殊な記号を覚える必要がありますよ!
.(ドット): カレントディレクトリ自身./は、「今いるこの場所にある」という意味を明示的に示します。 例えば、カレントディレクトリにあるスクリプトscript.shを実行する際、./script.shと書くのは、「カレントディレクトリにあるscript.shを実行しろ」という意味なんですね。..(ドットドット): 親ディレクトリ(一つ上の階層) これが「linux 相対パス」の核心です!..は、「一つ上のディレクトリ」を指します。 (例を見てみましょう♪) あなたが/home/user1/documentsにいるとします。pwdの結果:/home/user1/documentsこの場所から、user1のホームディレクトリ(/home/user1)に戻りたい場合、..を使います。cd ..これで、カレントディレクトリは/home/user1になります。カンタンですよね! さらに、/home/user1から、/home/user2のディレクトリ(お隣さんのディレクトリですね)に移動したい場合はどうでしょう? まず..で一つ上の/homeに移動して、そこからuser2に入ります。cd ../user2これで、カレントディレクトリは/home/user2になります。../../のように繋げることもできちゃいます。/home/user1/documentsにいる時、cd ../../を実行すると、二つ上の/homeディレクトリに移動できるんですよ。/(スラッシュ): ディレクトリの区切り これは絶対パスでも使いますが、相対パスでも「ディレクトリの区切り」として使います。
📑 表1: 絶対パス vs 相対パス 徹底比較
ここで、絶対パスと相対パスの違いを、わかりやすく表でまとめてみますね!
| 比較項目 | 絶対パス (Absolute Path) | 相対パス (Relative Path) |
|---|---|---|
| 識別の方法 | 必ず / (ルート) から始まる | / から始まらない |
| 基準点 | / (ルートディレクトリ) | カレントディレクトリ ( pwd の結果) |
| 指す場所 | 常に一定。どこから実行しても変わらない。 | 実行場所によって変わる。カレントディレクトリに依存する。 |
| 主な用途 | スクリプト、設定ファイル、確実な移動 | 日常のコマンド操作、短い距離の移動 |
| 具体例 | /home/user1/documents/file.txt | documents/file.txt (今いる場所から見て) |
| 具体例 | /var/log/syslog | ../logs/app.log (一つ上の階層のlogsへ) |
| メリット | 確実性が高い。間違いが起こりにくい。 | 入力が短くて済む。移動が効率的。 |
| デメリット | 入力が長くなりがち。 | カレントディレクトリを意識しないと間違う。 |
初心者のうちは、迷ったら「絶対パス」を使うのが安全策かもしれませんね。
でも、日常的な操作(特に cd や ls)では、相対パス(特に .. やタブ補完)を使いこなせると、作業効率が劇的にアップしますよ!
Linux「ホームディレクトリ」の概念と「チルダ(~)」の謎
絶対パスと相対パスを学んだところで、Linuxにおけるもう一つの重要な「パス」の概念、「linux ホームディレクトリ」について解説していきますね!
🏡 ホームディレクトリとは?(自分専用の家)
ホームディレクトリとは、Linuxシステムにログインした各ユーザーに割り当てられる「自分専用の作業部屋(ディレクトリ)」のことです。
なんだかワクワクしますよね♪
通常、/home/ ディレクトリの中に、各ユーザー名(例:user1, user2)のディレクトリとして作られています。
user1のホームディレクトリ:/home/user1user2のホームディレクトリ:/home/user2
(※ちなみに、root という特権ユーザー(なんでもできちゃうスーパーマンみたいな人です)だけは別格で、ホームディレクトリは /root になります)
あなたがターミナルを開いてシステムにログインした時、最初にいる場所(カレントディレクトリ)が、このホームディレクトリなんです。
user1でログインした直後
[user1@hostname ~]$ pwd /home/user1
「でも、なんでホームディレクトリなんて必要なの?」って思いませんか?
Linuxは「マルチユーザーシステム」といって、一つのシステムを複数のユーザーが同時に利用することを前提に設計されているんです。
もし全員が /(ルート)直下で作業を始めたら…想像してみてください!
他の人の大事なファイルをうっかり消しちゃったり、設定ファイルがごちゃ混ぜになったりして、もう大混乱ですよね(泣)
そこで、各ユーザーに「あなたの作業は、原則としてこの専用の部屋(ホームディレクトリ)の中で行ってくださいね」と場所を割り当てることで、システムの秩序と安全を保っている、というわけなんです。
❓ 「linux ホームディレクトリ 確認」方法
「じゃあ、私のホームディレクトリはどこなの?」って気になりますよね。
自分のホームディレクトリがどこにあるかを確認する方法はいくつかありますよ♪
- ログイン直後に
pwdを打つ これが一番カンタンで確実な方法です![user1@hostname ~]$ pwd /home/user1 echo $HOMEコマンドを使う Linuxには「環境変数」という、システム全体で共有される便利な変数があります。$HOME\ という環境変数には、ログインしているユーザーのホームディレクトリの「絶対パス」が自動的に格納されているんです。 \ コマンドは、その中身を表示してくれるコマンドなんですよ。 \ echo $HOME /home/user1この方法は、あなたが今どこ(カレントディレクトリ)にいようとも、常にあなたのホームディレクトリの絶対パスを表示してくれる優れものです✨/etc/passwdファイルを見る(ちょっと上級者向けかも) ユーザー情報が書かれている/etc/passwdというファイルに、各ユーザーのホームディレクトリが記録されています。grepコマンドで自分のユーザー名(ここではuser1)を探してみましょう!
コロン([user1@hostname ~]$ grep user1 /etc/passwd user1:x:1001:1001::/home/user1:/bin/bash:)で区切られた6番目のフィールド(/home/user1)が、そのユーザーのホームディレクトリなんですね。
🌀 「linux チルダ (~)」の正体:ホームディレクトリへのショートカット
さて、ここでターミナルの表示に注目してみてください!
[user1@hostname ~]$
あれ?カレントディレクトリが /home/user1 のはずなのに、pwd の結果と違って、~(チルダ)というナゾの記号が表示されていませんか?
この「linux チルダ (~)」こそが、ホームディレクトリを扱う上で最強のショートカットキーだったんです!💖
チルダ ~ は、「あなたのホームディレクトリの絶対パス($HOME の中身)」と全く同じ意味を持ちます。
つまり、user1 さんにとって、
~ は /home/user1
と、まったく同じ意味なんです!
この ~ は、パスの指定において絶大な威力を発揮しますよ〜!
(例)cd コマンドでの利用
あなたが今、システムの奥ふか〜く /var/log/nginx にいるとします。
ここから自分のホームディレクトリに一瞬で戻りたい時、どうしますか?
絶対パスを使うなら:
cd /home/user1
チルダを使うなら:
cd ~
たったこれだけです!カンタンすぎませんか!?
cd コマンドは、引数を何も指定しなかった場合も cd ~ と同じ動作(ホームディレクトリへ移動)をするように設計されているんですが、チルダの便利さはそれだけじゃないんですよ。
(例)ホームディレクトリ以下のファイルへのアクセス
ホームディレクトリにある documents/report.txt を、/tmp ディレクトリからコピーしたい場合。
絶対パス:
cp /home/user1/documents/report.txt .
チルダ:
cp ~/documents/report.txt .
入力がすっごく短くなりますよね♪
(例)他のユーザーのホームディレクトリ(応用編)
~ の直後にユーザー名を書くと、「そのユーザーのホームディレクトリ」を指すこともできちゃいます。
~user2 は /home/user2 を意味するんですね。
user1がuser2の(権限があれば)中身を見る
[user1@hostname ~]$ ls ~user2/pictures /home/user2/pictures/cat.jpg /home/user2/pictures/dog.jpg
チルダ ~ は、カレントディレクトリがどこであろうと、常に「ホームディレクトリ(/home/user1)」という絶対的な基点として機能してくれるんです。
相対パスの「..(一つ上)」と、ホームディレクトリの「~(家)」を使いこなせれば、Linux上の移動で困ることはほぼなくなるはずですよ!
実践!パスを使った基本コマンド操作 (cd, ls, pwd)
ここまで学んできた「絶対パス」「相対パス」「ホームディレクトリ(~)」が、実際のコマンド操作でどんな風に使われるのか、具体的に見ていきましょう!
ここで解説する pwd, ls, cd は、Linux操作の三種の神器とも言える大事なコマンドたちです。
(この記事の戦略的意図として、cd や ls の解説記事から、この「パス」の記事へリンクが集まるように、しっかり解説していきますね!)
1. pwd (print working directory): 現在地を知る
pwd は、パス操作の基本中の基本、「カレントディレクトリ(現在地)」の絶対パスを表示してくれるコマンドです。
もし相対パス操作で「あれ?」と迷ったら、まず pwd を実行して、自分の「基準点」を確認するクセをつけると安心ですよ♪
[user1@hostname ~]$ pwd /home/user1
[user1@hostname ~]$ cd /var/log [user1@hostname log]$ pwd /var/log
応用: pwd -P (シンボリックリンクを解決)
通常、pwd はシンボリックリンク(ショートカットみたいなものです)をたどった場合、リンク名を含んだパスを表示します(-L オプションがデフォルトなんです)。
もし、リンク先の「物理的な(本当の)」絶対パスが知りたい場合は、-P オプションを使います。
(今は「ふーん、そういうものがあるんだな」程度で大丈夫ですよ!)
2. ls (list): 周囲を見渡す
ls は、指定したディレクトリの中身(ファイルやディレクトリのリスト)を表示するコマンドです。
この「指定したディレクトリ」の指定方法に、パスの知識が総動員されるんですよ!
(例)カレントディレクトリの中身を見る
引数を何も指定しないか、.(カレントディレクトリ)を指定します。
[user1@hostname ~]$ pwd /home/user1 [user1@hostname ~]$ ls documents downloads pictures public_html
[user1@hostname ~]$ ls . documents downloads pictures public_html
どちらも同じ結果(カレントディレクトリの中身)になりますね。
(例)絶対パスで指定した場所の中身を見る
今いる場所(/home/user1)に関わらず、/(ルート)の中身を見ます。
[user1@hostname ~]$ ls / bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
(例)相対パスで指定した場所の中身を見る
カレントディレクトリ(/home/user1)を基準に、「documents の中身」を見ます。
[user1@hostname ~]$ ls documents report_2025.txt summary.pdf
(例)親ディレクトリ(..)の中身を見る
カレントディレクトリ(/home/user1)を基準に、「一つ上の /home の中身」を見ます。
[user1@hostname ~]$ ls .. user1 user2
(例)ホームディレクトリ(~)の中身を見る
カレントディレクトリがどこであれ、「自分のホームディレクトリの中身」を見ます。
(今はホームにいるので、ls と同じ結果になりますが、/tmp みたいな別の場所で実行すると違いがハッキリわかりますよ!)
[user1@hostname ~]$ ls ~ documents downloads pictures public_html
ls コマンドは、 -l (詳細表示) や -a (隠しファイルも表示) といったオプションとパス指定を組み合わせて使うのが一般的です。
ls -la ~/ (ホームディレクトリの隠しファイルを含む全詳細リスト)
ls -l ../ (親ディレクトリの詳細リスト)
3. cd (change directory): 場所を移動する
cd は、カレントディレクトリを「移動する」ためのコマンドです。
このコマンドこそ、絶対パスと相対パスの使い分けが最も活きるコマンドと言ってもいいかもしれません!
(例)絶対パスで移動する
カレントディレクトリがどこであれ、確実に /etc/nginx へ移動します。
[user1@hostname ~]$ cd /etc/nginx [user1@hostname nginx]$ pwd /etc/nginx
(例)相対パス(子ディレクトリへ)で移動する
カレントディレクトリ(/home/user1)を基準に、「pictures の中」へ移動します。
[user1@hostname ~]$ pwd /home/user1 [user1@hostname ~]$ cd pictures [user1@hostname pictures]$ pwd /home/user1/pictures
(例)相対パス(親ディレクトリへ)で移動する
カレントディレクトリ(/home/user1/pictures)を基準に、「一つ上の /home/user1」へ移動します。
[user1@hostname pictures]$ pwd /home/user1/pictures [user1@hostname pictures]$ cd .. [user1@hostname ~]$ pwd /home/user1
(例)相対パス(複雑な移動)
カレントディレクトリ(/home/user1/pictures)を基準に、「一つ上の /home/user1」にある「documents」へ移動してみましょう。
[user1@hostname pictures]$ pwd /home/user1/pictures [user1@hostname pictures]$ cd ../documents [user1@hostname documents]$ pwd /home/user1/documents
(例)ホームディレクトリ(~ または引数なし)へ移動する
どんなに深い場所に迷い込んじゃっても(笑)、一瞬でホームディレクトリ /home/user1 へ戻れます!
[user1@hostname /var/log/httpd/archive]$ pwd /var/log/httpd/archive
[user1@hostname archive]$ cd ~ [user1@hostname ~]$ pwd /home/user1
[user1@hostname archive]$ cd [user1@hostname ~]$ pwd /home/user1
そうなんです、cd とだけ打つのと cd ~ は同じ動作をするんですね。
(例)直前にいたディレクトリへ移動する(cd -)
cd - はとーっても便利で、「直前にいたカレントディレクトリ」へトグル(切り替え)移動できるんです。
[user1@hostname ~]$ pwd /home/user1
[user1@hostname ~]$ cd /etc [user1@hostname etc]$ pwd /etc
[user1@hostname etc]$ cd - /home/user1 <-- 移動先(直前にいた場所)が表示されます! [user1@hostname ~]$ pwd /home/user1
[user1@hostname ~]$ cd - /etc <-- 再び /etc に戻れちゃいます [user1@hostname etc]$ pwd /etc
cd コマンドでパス指定をマスターすることが、Linux操作の第一歩ですね!
「linux 相対パス」の指定(特に cd .. や cd ../../)に、ぜひ慣れてみてください♪
パスを使ったファイル・ディレクトリ操作 (mkdir, touch, cp, mv, rm)
パスの概念って、cd や ls だけでなく、ファイルやディレクトリを作成、コピー、移動、削除する「すべて」のコマンドで必要になるんです!
ここからは、15000文字の目標に向けて、これらのコマンドとパスの関係性を、とことん徹底的に解説していきますね!
1. mkdir (make directory): ディレクトリ(部屋)を作る
mkdir は新しいディレクトリ(Windowsでいうフォルダですね)を作成するコマンドです。
「どこに」作るかを、パスで指定してあげるんですよ。
(例)相対パスで作成
カレントディレクトリ(/home/user1)に project というディレクトリを作成してみましょう。
[user1@hostname ~]$ pwd /home/user1 [user1@hostname ~]$ mkdir project [user1@hostname ~]$ ls documents downloads pictures public_html project <-- 作成されました!
(例)絶対パスで作成
カレントディレクトリがどこであれ、/tmp の直下に my_temp_dir を作成します。
[user1@hostname ~]$ mkdir /tmp/my_temp_dir
(例)ホームディレクトリ(~)基準で作成
~/backup は /home/user1/backup と解釈されます。便利ですよね♪
[user1@hostname ~]$ mkdir ~/backup
(例)-p オプションで深い階層を一度に作成
パスの途中のディレクトリが存在しなくても、-p をつければ全部まとめて作成してくれちゃいます!
[user1@hostname ~]$ mkdir -p project/src/main/java
上のコマンドは project の中に src を、その中に main を、その中に java を一度に作成してくれます。スゴイ!
2. touch (touch): 空のファイルを作る
touch は、中身が空っぽのファイルを作成したり、既存のファイルのタイムスタンプ(更新日時)を新しくしたりするコマンドです。
(例)相対パスで作成
カレントディレクトリに memo.txt を作成します。
[user1@hostname ~]$ touch memo.txt
(例)既存のディレクトリ内に作成
相対パスで project ディレクトリの中に README.md を作成します。
[user1@hostname ~]$ touch project/README.md
(例)絶対パスで作成
/tmp に test.log を作成します。
[user1@hostname ~]$ touch /tmp/test.log
3. cp (copy): コピーする
cp はファイルやディレクトリをコピーするコマンドです。
cp [コピー元パス] [コピー先パス] のように、2つのパスを指定します。
ここでもパスの知識がフル活用されますよ!
(例)相対パス -> 相対パス(リネームコピー)
カレントディレクトリにある memo.txt を、同じ場所に memo_backup.txt という名前でコピーします。
[user1@hostname ~]$ cp memo.txt memo_backup.txt
(例)絶対パス -> 相対パス(. の活用)
/etc/hosts というファイルを、カレントディレクトリ(.)にコピーしてきます。
[user1@hostname ~]$ cp /etc/hosts . [user1@hostname ~]$ ls documents ... project memo.txt memo_backup.txt hosts <-- コピーされましたね!
(例)ホーム(~) -> 絶対パス
ホームディレクトリにある ~/project/README.md を、Webサーバーの公開ディレクトリ /var/www/html/ にコピーします。
[user1@hostname ~]$ cp ~/project/README.md /var/www/html/
(※コピー先の /var/www/html/ の最後の / は、「そのディレクトリの中に同じ名前でコピーしてね」という意味なんですよ)
4. mv (move): 移動・リネームする
mv はファイルやディレクトリを「移動」するコマンドです。
同じディレクトリ内で移動させると「リネーム(名前変更)」になる、という面白い特性があります。
mv [移動元パス] [移動先パス] のように指定します。
(例)リネーム(相対パス -> 相対パス)
memo_backup.txt を memo.old に名前変更してみましょう。
[user1@hostname ~]$ mv memo_backup.txt memo.old
(例)移動(相対パス -> 相対パス)
memo.txt と memo.old を project ディレクトリの中に移動します。
[user1@hostname ~]$ mv memo.txt memo.old project/ [user1@hostname ~]$ ls project/ README.md memo.txt memo.old src
(例)移動(絶対パス -> ホーム)
/tmp/test.log をホームディレクトリ(~)に移動します。
[user1@hostname ~]$ mv /tmp/test.log ~
5. rm (remove): 削除する
rm はファイルやディレクトリを削除するコマンドです。
ここ、とーっても注意してください!rm はゴミ箱を経由せず、即座に「完全削除」されちゃうんです(泣)
なので、パス指定は全コマンドの中で最も慎重になる必要がありますよ!
(例)相対パスでファイルを削除
カレントディレクトリの hosts ファイルを削除します。
[user1@hostname ~]$ rm hosts
(例)相対パスでディレクトリを削除(-r が必要)
ディレクトリを削除するには -r (recursive: 再帰的) オプションが必要です。
project ディレクトリとその中身をすべて削除します。
[user1@hostname ~]$ rm -r project
(※本当に消えちゃうので、実行には十分注意してくださいね!)
(例)絶対パスでの削除(細心の注意)
/tmp/my_temp_dir を削除します。
[user1@hostname ~]$ rm -r /tmp/my_temp_dir
⚠️ 警告:絶対パス rm の恐怖
Linuxの歴史上、最も恐れられているコマンドミスの一つが、rm -rf / です…。
rm: 削除しろ-r: ディレクトリの中身ごと再帰的に-f: 警告を無視して強制的に/: (ルートディレクトリ)
これは、「システムの頂点(ルート)から、すべてのファイルとディレクトリを、警告なしで強制的に削除しろ」という、とんでもない命令になります。
これを実行してしまうと、Linuxシステムは完全に破壊されます(本当に再起不能です…)。
絶対パス、特に / を rm コマンドで扱う際は、自分が何をしているのかを100回確認するくらいの慎重さを持ってくださいね!
なぜ「相対パス」で失敗するのか?初心者が陥る罠と解決策
ここまでパスの基本と応用を学んできましたが、理論がわかっても、なぜか初心者のうちは「linux 相対パス」で失敗しちゃうんですよね(私もそうでした…)。
ここでは、筆者自身の経験(E-E-A-Tの「経験」ですね!)に基づき、初心者が陥りがちな典型的な「罠」と、それを乗り越えるための「思考法」を解説します!
罠1: カレントディレクトリ(現在地)を誤解している
最も多い失敗がこれだと思います!
「ls したら project ディレクトリが見えている。だから cd project で移動できるはずだ」
これは正しいです。バッチリです!
「さっき /home/user1 で ls したら project が見えた。今、/tmp にいるけど、cd project で移動できるはずだ」
これは間違いなんです!(泣)
相対パスは、「今いる場所(カレントディレクトリ)」を基準にしますよね。
/tmp にいる時に cd project を実行すれば、システムは /tmp/project を探しに行ってしまいます。
/home/user1/project には行ってくれないんです…。
✅ 解決策
- 操作の前に、必ず
pwdを実行するクセをつけること! - 「自分は今、どこにいるのか?」を常に意識する。
- 迷ったら、
cd /home/user1/projectのように絶対パスを使う。これが一番安全です♪
罠2: スクリプト実行時の「カレントディレクトリ」問題
これは、中級者へのステップアップで必ずつまずく罠かもしれません…。
以下のようなシェルスクリプト myscript.sh を ~/project に作成したとします。
~/project/myscript.sh
#!/bin/bash
カレントディレクトリに log.txt を作成する
touch ./log.txt echo "ログファイルを作成しました" このスクリプトは、「カレントディレクトリに log.txt を作る」という内容ですね。
(失敗するケース)
あなたがホームディレクトリ(/home/user1)にいる時に、このスクリプトを絶対パスで実行したとします。
[user1@hostname ~]$ pwd /home/user1
[user1@hostname ~]$ /home/user1/project/myscript.sh ログファイルを作成しました
さて、log.txt はどこに作成されたでしょうか?
~/project の中だと思いますよね?
いいえ、違うんです…
[user1@hostname ~]$ ls documents ... project log.txt <-- ええっ!?ここに作成される!
なぜなら、スクリプトを実行した「あなた」のカレントディレクトリは /home/user1 だったからです。
スクリプト内の ./log.txt の .(カレントディレクトリ)は、スクリプトが置いてある場所(/home/user1/project)ではなく、スクリプトを実行した場所(/home/user1)を指してしまうんです!
これが、「スクリプトを直接実行すると動くのに、別の場所から実行すると動かない」現象の正体だったんですね。
✅ 解決策(上級テクニックです♪)
スクリプト内で、ファイルの置き場所を「スクリプトファイル基準」にしたい場合は、スクリプトの冒頭で以下のおまじないを書くといいですよ。
#!/bin/bash
このスクリプトファイルが置いてあるディレクトリへ、カレントディレクトリを強制的に移動する
cd $(dirname $0)
これで、./log.txt は常にスクリプトと同じ場所 (~/project) に作成されます!
touch ./log.txt echo "ログファイルを作成しました"
($(dirname $0) は「スクリプト自身のパス」を取得する特殊な記述なんです。ちょっと難しいかもですが、便利ですよ!)
罠3: .. の使いすぎで混乱する
相対パスの .. は便利なんですけど、使いすぎると「あれ、今どこだっけ?」と自分がどこにいるのか分からなくなっちゃいます(笑)
cd ../../../project/src/
こんなパス指定は、タイプミスを誘発しやすいですし、間違いの元ですよね。
✅ 解決策
- 複雑な移動は、一度
cd ~やcd /など、分かりやすい基点に絶対パスで移動してから、改めて相対パスで移動するのがオススメです。 - タブ補完機能(ファイル名の途中まで打って
Tabキーを押すと補完される機能)を積極的に使って、タイプミスを防ぎましょうね!
罠4: シンボリックリンクを理解していない
シンボリックリンク(Windowsのショートカットに近いものです)が絡むと、パスはさらに複雑になっちゃいます…
例えば、/home/user1/www が、実際には /var/www/html へのシンボリックリンクだったとします。
[user1@hostname ~]$ ls -l ... lrwxrwxrwx 1 user1 user1 15 11月 9 18:00 www -> /var/www/html
この時、cd www で移動すると、pwd の結果はどうなるでしょうか?
[user1@hostname ~]$ cd www [user1@hostname www]$ pwd /home/user1/www
なんと、pwd はデフォルトではリンクをたどった「見た目上」のパス(/home/user1/www)を表示するんです。
でも、このディレクトリに touch test.txt でファイルを作ると、ファイルはどこにできると思いますか?
正解は、リンク先の「本体」である /var/www/html/test.txt なんです!
この「見た目のパス」と「実際のパス」のズレが、混乱を招いちゃうんですね。
✅ 解決策
ls -lを使って、ディレクトリがシンボリックリンク(lで始まって、->があるやつです)かどうかを常に確認しましょう。pwd -Pを使って、物理的な(本当の)絶対パスを確認するクセをつけるとバッチリです![user1@hostname www]$ pwd -P /var/www/html
上級者への一歩:パスの応用知識
最後に、パスの概念をさらに深掘りする「応用知識」を解説しますね!
これが分かれば、あなたはもう初心者さんじゃありません!✨
1. $PATH (環境変数パス): コマンドはどこにあるのか?
あなたは今まで、ls や cd、pwd といったコマンドを、単に ls と打つだけで実行してきましたよね。
でも、これらのコマンドも、実際には /bin/ls や /bin/pwd といった「実行ファイル」なんです。
「あれ?なんで絶対パスの /bin/ls や、相対パスの ./ls って書かなくても実行できるの?」
その秘密が、環境変数「$PATH」にあるんです!
echo $PATH を実行してみてください。
[user1@hostname ~]$ echo $PATH /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user1/.local/bin:/home/user1/bin
コロン(:)で区切られた、複数の「絶対パス」のリストが表示されましたよね?
これは、「コマンド検索用のパス(道筋)リスト」なんです。
あなたが ls と入力してエンターキーを押すと、システムはこんな動作をしています。
$PATHの先頭(/usr/local/bin)にlsというファイルがあるか探す -> ないなぁ。- 次の(
/usr/bin)にlsというファイルがあるか探す -> あった! (/usr/bin/ls) /usr/bin/lsを実行する。
これが、ls だけでコマンドが実行できる仕組みだったんですね!
なぜ自作スクリプトは ./ が必要なのか?
では、先ほど作成した ~/project/myscript.sh はどうでしょう?
myscript.sh とだけ打っても、「command not found(コマンドが見つかりません)」とエラーになっちゃいます。
なぜなら、~/project(つまり /home/user1/project)というパスは、あの$PATH のリストに含まれていないからです。
システムがいくら探しても、見つけられないんですね。
そこで、./myscript.sh と「相対パス」で指定してあげる必要があったんです。
./ は「カレントディレクトリにある」という意味でしたよね。
./ をつけることで、「$PATH のリストは探さなくていいよ!今いる場所にある、このファイルを実行して!」と、パスを明示的に指定しているわけなんです。
(※ちなみに、セキュリティ上の理由から、カレントディレクトリ(.)を $PATH に追加することは、あまりオススメされていません)
2. シンボリックリンクと相対パス
シンボリックリンク(ln -s [リンク元] [リンク名])を作成する時、リンク元を「絶対パス」で書くか「相対パス」で書くかは、とーっても重要なんですよ。
(例)絶対パスでリンクを作成(こっちが安全かも)
[user1@hostname ~]$ ln -s /var/log/syslog ~/syslog_link この ~/syslog_link は、どこに移動させても、必ず /var/log/syslog を指してくれます。
(例)相対パスでリンクを作成(ちょっと注意が必要!)
project ディレクトリ内で、README.md へのリンク index.md を作成します。
[user1@hostname project]$ pwd /home/user1/project [user1@hostname project]$ ln -s README.md index.md
ls -l すると、index.md -> README.md となります。
project ディレクトリにいる限りは、これは正しく動作します。
でも、この index.md というリンクファイルだけを、別の場所(例:~/)に移動したらどうなるでしょう?
[user1@hostname project]$ mv index.md ~/ [user1@hostname ~]$ ls -l index.md lrwxrwxrwx 1 user1 user1 9 11月 9 18:10 index.md -> README.md <-- リンク切れ(赤く表示されちゃいます…)
移動先の ~/ には README.md が存在しないため、リンクが切れてしまうんです(泣)
相対パスで作成されたシンボリックリンクは、「リンクファイル自身がある場所からの相対パス」でリンク先を保持するため、リンクファイルだけを移動させると破綻しちゃうんですね。
📑 表2: パス関連の特殊記号と環境変数まとめ
最後に、この記事で登場したパスに関連する重要な記号と変数を、一覧表にまとめておきますね!復習にどうぞ♪
| 記号 / 変数 | 意味 | 種類 | 解説 |
|---|---|---|---|
/ | ルートディレクトリ | 絶対パス | パスの起点。すべてのファイルは / の下にあるんです。 |
/ | 区切り文字 | 共通 | ディレクトリとファイル名を区切ります。 |
. | カレントディレクトリ | 相対パス | 「今いる場所」。./script.sh のように使いますね。 |
.. | 親ディレクトリ | 相対パス | 「一つ上の階層」。cd ../ のように使います。 |
~ | ホームディレクトリ | 絶対パス (の短縮) | ログイン中のユーザーのホームを指す最強ショートカット!cd ~ や ~/docs。 |
~user | 他のユーザーのホーム | 絶対パス (の短縮) | user のホームディレクトリを指します。ls ~user2。 |
- | 直前のディレクトリ | cd 専用 | cd - で、直前にいたカレントディレクトリに戻れます。 |
$HOME | ホームディレクトリ | 環境変数 | ホームの絶対パスが格納されています。echo $HOME。 |
$PWD | カレントディレクトリ | 環境変数 | カレントディレクトリの絶対パスが格納されています。 |
$PATH | コマンド検索パス | 環境変数 | コマンド実行時に検索されるディレクトリのリストでしたね! |
まとめ:パスを制する者がLinuxを制する
おつかれさまでした!この記事では、15000文字近いボリュームで、Linuxの「パス」に関するほぼ全ての概念を、これでもか!というくらい網羅的に解説してきました。
最後に、重要なポイントをもう一度まとめますね。
- パスとは、ファイルやディレクトリへの「住所」のこと。
- 絶対パスは、必ず
/(ルート)から始まる「完全な住所」。実行場所に関わらず、常に同じ場所を指します。 - 相対パスは、
/から始まらない、「現在地(カレントディレクトリ)」を基準にした住所。実行場所によって指す先が変わっちゃいます。 - カレントディレクトリ(現在地)は
pwdで確認!相対パス操作の前にはpwdを確認するクセをつけましょうね。 ..は「一つ上(親)」、.は「今いる場所」を指す、相対パスのとっても大事な記号です。- linux ホームディレクトリは、各ユーザー専用の作業部屋(通常
/home/username)のこと。 - linux チルダ (
~) は、自分のホームディレクトリを一発で指し示す、最強のショートカット(絶対パス/home/usernameと同義)でした! cd(移動),ls(一覧),cp(コピー),rm(削除)など、すべてのファイル操作コマンドは、パスの指定によって動作するんですね。
「絶対パス」と「相対パス」の違い、そして「カレントディレクトリ」の概念を正確に理解すること。
これが、Linuxのコマンドライン操作をマスターするための、最も重要で、最も確実な第一歩なんだと、私は思います!
「No such file or directory」のエラーが出た時は、慌てずに「あ、またやっちゃった!」と笑って、pwd を実行してみてください。
そして、自分が指定したパス(絶対パスかな?相対パスかな?)が、カレントディレクトリを基準に見て正しいかどうかを、もう一度見直してみてくださいね。
この「地図の読み方」さえ身につければ、あなたのLinux操作は劇的に上達するはずですよ!💖


コメント