パスとコマンド|コマンドライン・Git・変更管理

このページはプロモーション(広告)を含みます。

コマンドライン・Git・変更管理(初級・読む25分+演習30分)

この授業のゴール

仕事でどう使うか

分析や開発の仕事では、ファイルの場所を文字で正確に指定する場面が毎日あります。GUI(Graphical User Interface:マウスで操作する画面)だけでは、手順を他人に渡したり、自動で繰り返したりできません。コマンドライン(文字で命令を入力して操作する方法)は、手順を「そのままコピーして再実行できる文章」にする道具です。

路線 この授業の使いどころ
DS(データサイエンティスト) 分析スクリプトを python3 src/clean.py のように実行し、入力CSVと出力先のパスを手順書に書く
ML(機械学習エンジニア) 学習データ・モデル・ログのフォルダ構成を決め、サーバーやクラウドでも同じパスで動くようにする
DX(DX推進・AI企画) 共有フォルダの命名規則や、自動処理の「どこから読みどこへ書くか」を業務手順に明記する
RS(研究者) 実験の再現手順を「どのフォルダで何を実行したか」まで記録し、論文の付録や共同研究者に渡す

この授業はモジュール SE01 の土台です。次の授業から使う Git(変更履歴を管理する道具)も、ターミナルでフォルダを移動してから操作します。

前提

次の知識を使います。不安があれば先に戻ってください。

この授業には2種類の操作が出てきます。必ず区別してください。

種類 どこで動くか 目的
ブラウザ内のPython(実行 ボタン) この教材の画面の中だけ。あなたのMacのファイルには触れない パスの計算を安全に試す
Macのターミナル(あなたが自分で入力) あなたのMac本体 本物のフォルダを作って確かめる

ターミナルは、Finder →「アプリケーション」→「ユーティリティ」→「ターミナル」で開けます。執筆時点(2026年)のmacOSでは、標準のシェル(コマンドを読み取って実行するプログラム)は zsh です。行頭に % が表示されて入力を待ちます。この教材のコマンド例では % を書きません。

身近な状況:同じスクリプトなのに「ファイルが見つからない」

分析担当のハナさんは、次のフォルダ構成で集計スクリプトを作りました。

/Users/hana/sales-report/
├── data/
│   └── sales.csv
├── src/
│   └── summarize.py      ← open("data/sales.csv") と書いてある
└── out/

ハナさんが sales-report フォルダで python3 src/summarize.py を実行すると、正しく動きます。ところが、src フォルダに移動してから python3 summarize.py と実行すると、次のエラーになりました。

FileNotFoundError: [Errno 2] No such file or directory: 'data/sales.csv'

ファイルは消えていません。違うのは「どこから実行したか」だけです。data/sales.csv という書き方は「いまいる場所から見て data フォルダの中の sales.csv」という意味なので、いまいる場所が src だと /Users/hana/sales-report/src/data/sales.csv を探してしまいます。そこにはファイルがありません。

実行した場所 data/sales.csv が指す実際の場所 結果
/Users/hana/sales-report /Users/hana/sales-report/data/sales.csv 見つかる
/Users/hana/sales-report/src /Users/hana/sales-report/src/data/sales.csv 見つからない

この授業では、この「いまいる場所」と「パスの書き方」の関係を正確に扱えるようにします。

直感的な説明:住所と「いまいる部屋」

ファイルのパス(path:場所を表す文字列)は住所にたとえられます。

「いまいる部屋」にあたるのが作業ディレクトリ(current working directory。カレントディレクトリともいう)です。ディレクトリはフォルダのことです。ターミナルでもPythonでも、プログラムは必ずどこかのディレクトリに「いて」、相対パスはそこを起点に読まれます。

たとえと実際の違い:住所は人が見れば間違いに気づけますが、コンピュータは書かれた文字列を機械的につなげるだけです。1文字でも違えば別の場所になり、存在しなければエラーになります。

正確な定義:パスの規則とコマンドの形

パスの規則(macOS・Linux)

書き方 意味 例(作業ディレクトリが /Users/hana/proj のとき)
/ で始まる 絶対パス。ルート(最上位)から数える /tmp/a.txt → /tmp/a.txt
/ で始まらない 相対パス。作業ディレクトリにつなげる data/a.csv → /Users/hana/proj/data/a.csv
. いまのディレクトリ ./a.txt → /Users/hana/proj/a.txt
.. 1つ上のディレクトリ(親) ../b.txt → /Users/hana/b.txt
~ ホームディレクトリ(自分専用の最上位。例:/Users/hana) ~/notes → /Users/hana/notes

区切りは / です(Windowsでは \ を使うので、他人のコードを読むときは注意)。名前に空白を含む場合は "My Data" のように引用符で囲みます。~ はシェルが置き換える記号で、Pythonの open("~/a.txt") では置き換えられません。

コマンドの形

コマンド名  オプション  引数
ls          -l          data

オプションは動作の切り替え(-l は詳しく表示)、引数は対象(ここでは data フォルダ)です。この授業で使うコマンドは次のとおりです。

コマンド 働き 取り消せるか
pwd 作業ディレクトリの絶対パスを表示(print working directory) 読むだけ
ls / ls -la 中身を一覧。-a は . で始まる隠しファイルも表示 読むだけ
cd 場所 作業ディレクトリを移動。cd だけならホームへ 移動だけ
mkdir -p 名前 ディレクトリを作る。-p は途中も作り、既存でもエラーにしない 作るだけ
cat ファイル 中身を表示 読むだけ
cp 元 先 / mv 元 先 コピー/移動・名前変更。先に同名があると上書き 注意
echo 文字 > ファイル 文字をファイルへ書く。> は上書き、>> は追記 注意
rm ファイル 削除。ゴミ箱を経由せず、元に戻せない この教材では使わない

コマンドは終わると終了ステータス(0なら成功、0以外なら失敗)を返します。直前の値は echo $? で見られます。

段階付き例題:Macのターミナルで作業用フォルダを作る

ここからはあなたのMacで実際に試します。すべてホームの下に作る se01-practice フォルダの中だけで行います。既存のファイルには触れません。

ステップ1:いまの場所を確かめる

cd ~
pwd

出力例:/Users/hana(hana の部分はあなたのユーザー名になります)。

ステップ2:作業用フォルダを作って移動する

mkdir -p ~/se01-practice/sales-report/data ~/se01-practice/sales-report/src
cd ~/se01-practice/sales-report
pwd

出力例:/Users/hana/se01-practice/sales-report。

ステップ3:小さなファイルを作って確かめる

echo "date,amount" > data/sales.csv
echo "2026-04-01,1200" >> data/sales.csv
cat data/sales.csv
ls -l data

cat の出力は2行(date,amount と 2026-04-01,1200)です。1行目は > で新しく書き、2行目は >> で追記しました。

ステップ4:相対パスの起点が変わることを確かめる

cd src
pwd
ls data/sales.csv
ls ../data/sales.csv
cd ..

ls data/sales.csv は No such file or directory になり、ls ../data/sales.csv は表示されます。src から見ると data は「1つ上(..)の中」にあるからです。最後に cd .. で sales-report に戻ります。

ステップ5:Finderで確かめる

open .

open . は、いまのディレクトリをFinderで開きます。片付けたいときは、Finderで se01-practice をゴミ箱に入れてください(ゴミ箱なら取り戻せます)。

ステップ 入力 処理 出力 意味
1 pwd 作業ディレクトリを表示 /Users/hana 起点の確認
2 mkdir -p と cd 作る→移動 /Users/hana/se01-practice/sales-report 作業場所の固定
3 echo >、>> 上書き→追記 2行のCSV 上書きと追記の違い
4 cd src 後の ls 起点が変わる 片方だけ見つかる 相対パスは場所に依存

操作して理解する:パスの計算をPythonで模擬する

次のコードはブラウザ内のPythonで動きます。あなたのMacのファイルは読み書きしません。標準ライブラリの posixpath(macOS・Linux形式のパスを文字列として計算するモジュール)を使います。

import posixpath
cwd = '/Users/hana/sales-report/src'          # 作業ディレクトリ(str)
for target in ['data/sales.csv', '../data/sales.csv', '/tmp/a.txt', './summarize.py']:
    full = posixpath.normpath(posixpath.join(cwd, target))
    print(f'{target:20} -> {full}')

出力:

data/sales.csv       -> /Users/hana/sales-report/src/data/sales.csv
../data/sales.csv    -> /Users/hana/sales-report/data/sales.csv
/tmp/a.txt           -> /tmp/a.txt
./summarize.py       -> /Users/hana/sales-report/src/summarize.py

試してみよう:cwd を '/Users/hana/sales-report' に変えると、1行目が正しい場所を指すことを確かめてください。'../../x' のように .. を重ねると、何階層上がるかも確かめましょう。

実務の対策:スクリプトの中では、実行場所に依存しないよう「スクリプト自身の場所」を起点にします。

from pathlib import Path
ROOT = Path(__file__).resolve().parent.parent   # src の1つ上 = sales-report
csv_path = ROOT / 'data' / 'sales.csv'          # どこから実行しても同じ場所

Path(__file__) は実行中のスクリプトのパス、.resolve() は絶対パス化、.parent は親ディレクトリです。ブラウザ内の実行では __file__ が無いので、このブロックは表示だけにしています。

発展:PATHとコマンドの正体

python3 や git と打つだけで動くのは、シェルが環境変数 PATH(コマンドを探すディレクトリの一覧。: 区切り)を順に探しているからです。

echo $PATH
which python3

which python3 は、実際に使われる python3 の絶対パスを表示します。複数のPythonが入っているMacでは、ここで表示されたものが動いています。「ターミナルでは動くのにエディタでは動かない」ときは、両者で PATH や使っているPythonが違うことがよくあります(「依存と実行環境」(有料版) の実行環境の話です)。

便利な操作:Tab キーでファイル名を補完できます(打ち間違いを防げます)。上矢印キーで前のコマンドを呼び出せます。Ctrl + C で実行中のコマンドを中断できます。

限界と注意:インターネットで見つけたコマンドを意味がわからないまま貼り付けないでください。特に sudo(管理者権限で実行)、rm -rf(確認なしで中身ごと削除)、curl ... | sh(ダウンロードしたものをそのまま実行)は、Mac全体を壊したり情報を漏らしたりする可能性があります。この教材ではこれらを使いません。

よくある失敗

失敗1:相対パスを書いて、実行場所によって壊れる

誤り:スクリプトに open('data/sales.csv') と書き、src フォルダで実行する。

import posixpath
for cwd in ['/Users/hana/sales-report', '/Users/hana/sales-report/src']:
    print(cwd, '->', posixpath.normpath(posixpath.join(cwd, 'data/sales.csv')))

出力の2行目は /Users/hana/sales-report/src/data/sales.csv となり、存在しない場所です。

なぜ誤りか:相対パスは「書いた人が想定した実行場所」でしか正しくありません。

直し方:①手順書に「sales-report フォルダで python3 src/summarize.py を実行」と実行場所まで書く。②スクリプト内では Path(__file__).resolve().parent を起点にパスを組み立てる。③エラーが出たら、まず pwd で現在地を確かめる。

失敗2:空白を含む名前を引用符なしで書く

誤り:

cd ~/se01-practice/My Data

出力:cd: string not in pwd: /Users/hana/se01-practice/My のようなエラーになります(シェルが空白で区切り、My と Data の2つの引数と解釈するため)。

直し方:cd ~/se01-practice/"My Data" のように引用符で囲む。~ は引用符の外に置きます("~/My Data" と書くと ~ が置き換えられません)。最初からフォルダ名に空白や日本語を使わず、my-data のように半角英数字とハイフンで付けると、Git・Python・サーバーのどこでも事故が減ります。

失敗3:`>` で大事なファイルを上書きする

誤り:メモを追加するつもりで echo "2026-04-02,800" > data/sales.csv と書く。

結果を cat data/sales.csv で見ると、2026-04-02,800 の1行だけになり、見出し行と前の行が消えます。> は「ファイルを空にしてから書く」記号だからです。ゴミ箱には入らず、元に戻せません。

記号 動作 書いた後の行数(元が2行のとき)
> 上書き 1行
>> 追記 3行

直し方:追記は >>。上書きの前に cat で中身を確かめる。原本のデータ(data/raw など)には書き込まず、加工結果は別のフォルダ(out/)に出す。rm も同じく元に戻せないので、この教材ではFinderのゴミ箱で消します。次の授業から学ぶGitで管理しているファイルなら、commit済みの版から取り戻せることもありますが、未commitの変更は戻せません。

まとめ

用語

コマンドライン(command line)

文字で命令を入力してコンピュータを操作する方法。ターミナルはそのための画面。

シェル(shell)

入力されたコマンドを読み取って実行するプログラム。macOSの標準はzsh。

作業ディレクトリ(current working directory)

プログラムが現在いるディレクトリ。相対パスの起点になる。pwdで表示できる。

絶対パス(absolute path)

ルート(/)から書いた完全な場所。作業ディレクトリに関係なく同じ場所を指す。

相対パス(relative path)

作業ディレクトリを起点にした場所の書き方。. は現在、.. は親を表す。

終了ステータス(exit status)

コマンドが終了時に返す数。0は成功、それ以外は失敗。echo $? で確認できる。

よくある質問

GUIのFinderで操作できるのに、なぜコマンドを覚えるのですか?

手順を文字で残せるからです。『このフォルダでこのコマンドを実行』と書けば、同僚も未来の自分も同じ操作を再現できます。Gitやサーバー、クラウドの多くの操作はコマンドが前提で、自動化(毎朝の集計など)にもつながります。

絶対パスを使えば相対パスの問題は起きないのでは?

あなたのMacでは動きますが、/Users/hana/... は他人のMacやサーバーには存在しません。共有するコードには、プロジェクトのフォルダを起点にした相対パスや Path(__file__) を使い、起点を手順書に明記するのが実務の定石です。

ブラウザ内のPythonで posixpath を使った計算と、Macでの実際の操作はどう違いますか?

ブラウザ内の計算は文字列を整理するだけで、ファイルの有無は調べません。Macのターミナルでは本物のファイルシステムを見るので、存在しなければエラーになります。模擬で理屈を確かめ、Macで実物を確かめる、という2段構えです。

どこで失敗しやすいですか?

①実行場所の思い込み(pwd を確かめない)、②空白入りの名前、③ > と >> の取り違え、④ネットで拾ったコマンドを意味を調べずに貼る、の4つです。迷ったら pwd と ls で状況を確かめてから次に進みましょう。

Windowsの人とファイルを共有するときは何が変わりますか?

区切りが \ で、ドライブ名(C: など)があります。Pythonでは pathlib.Path の / 演算子でつなぐと、OSに合った区切りになります。文字列に区切りを直書きしないのが安全です。

仕事でフォルダ構成はどう決めればよいですか?

よく使われるのは『data/raw(受け取った原本・書き込まない)』『data/processed(加工結果)』『src(コード)』『out(成果物)』の分け方です。原本を上書きしないこと、入力と出力の場所を手順書に書くことを優先しましょう。

確認問題

問1 作業ディレクトリが /Users/hana/proj/src のとき、相対パス ../data/a.csv が指す絶対パスはどれか。

  1. ① /Users/hana/proj/src/data/a.csv
  2. ② /Users/hana/data/a.csv
  3. ③ /Users/hana/proj/data/a.csv
  4. ④ /data/a.csv
解答と解説

正解:③

.. で src の親(/Users/hana/proj)に上がり、その中の data/a.csv を指します。

問2 スクリプトに open('data/sales.csv') と書いたところ、実行する場所によって FileNotFoundError になったりならなかったりする。最も適切な説明はどれか。

  1. ① Pythonの版が実行のたびに変わるから
  2. ② open は絶対パスしか受け付けないから
  3. ③ CSVファイルは毎回自動で移動されるから
  4. ④ 相対パスは作業ディレクトリを起点に解釈されるから
解答と解説

正解:④

相対パスは実行時の作業ディレクトリにつなげて解釈されるため、実行場所が変わると別の場所を探します。

問3 data/sales.csv(2行)に1行を加えたい。正しい操作はどれか。

  1. ① echo "x" > data/sales.csv
  2. ② echo "x" >> data/sales.csv
  3. ③ rm data/sales.csv してから作り直す
  4. ④ cat data/sales.csv
解答と解説

正解:②

>> は末尾に追記します。結果は3行になります。

問4 cd ~/se01-practice/My Data がエラーになった。直し方として適切なのはどれか。

  1. ① cd "~/se01-practice/My Data"
  2. ② sudo cd ~/se01-practice/My Data
  3. ③ cd ~/se01-practice/"My Data"
  4. ④ フォルダを rm -rf で消して作り直す
解答と解説

正解:③

空白を含む部分を引用符で囲み、~ は引用符の外に置くとシェルがホームに置き換えます。

問5 次のうち、この教材で「元に戻せない操作」として特に注意すべきものの組み合わせはどれか。

  1. ① rm と > による上書き
  2. ② cd と mkdir -p
  3. ③ pwd と ls
  4. ④ cat と open .
解答と解説

正解:①

rm はゴミ箱を経由せず削除し、> はファイルを空にしてから書きます。どちらも取り消せません。

問6 コマンド ls -l data の各部分の説明として正しいものはどれか。

  1. ① ls がオプション、-l がコマンド名、data が引数
  2. ② 3つとも引数
  3. ③ ls がコマンド名、-l が引数、data がオプション
  4. ④ ls がコマンド名、-l がオプション、data が引数
解答と解説

正解:④

コマンド名・オプション(動作の切り替え)・引数(対象)の順に並びます。

次に学ぶこと

次は Gitと変更差分 で、作業用フォルダの中にGitのリポジトリを作り、「作業中の変更」「ステージした変更」「commit」の3つを区別します。今日作った ~/se01-practice をそのまま使うので、残しておいてください。

ファイルの読み書きや例外を復習したいときは 「ファイルの読み書き」(有料版)・「例外と後処理」(有料版) に戻りましょう。この授業の確認問題だけで習得とはせず、SE01 の総合テストと自力課題で判定します。

キャリア学習:データサイエンティスト・機械学習エンジニア・DX推進・研究者を目指す人の学習アプリ。164モジュール・984授業を、ブラウザで動くSQLとPythonの演習で。基礎と各分野の最初のモジュールは無料。全部は2,980円の買い切り。

アプリを無料で開く有料版と無料版の違い