1-1. ターミナル基礎 - 移動・閲覧・作成

所要時間: 25-50分(がっつりなら2セッション分) ゴール: ホームディレクトリを自由に行き来し、構造を可視化できる コミット内容: 今日打ったコマンド履歴を ~/log/linux_day01.log に保存


大前提: ターミナルとは何か

ターミナルは「キーボードで OS に直接話しかける窓口」です。GUI(Finderとか)は、その裏で必ずターミナルと同じコマンドを叩いている。GUIで Cmd+N で新規フォルダを作る = 裏で mkdir が走っている。

エンジニアがターミナルを好む理由は3つ:

  1. GUIより速い - マウス移動なし、キー操作だけ
  2. 自動化できる - 「100個のファイルを連番でリネーム」みたいなのが一瞬
  3. リモートでも動く - Linux サーバーに ssh で繋いだら GUI は無い、ターミナルしかない

逆に言うと、バックエンドエンジニアにとってターミナルは「サーバーの中を見る唯一の手段」。これに慣れずに先に進むと、本番サーバーで何もできなくなる。だから最初にやる。


セッション①: 移動と閲覧(25分)

0. セッション録画スタート(必須)

# ログ保存先を作る
mkdir -p ~/log
 
# このコマンドから後の操作が全部記録される
script ~/log/linux_day01.log

script コマンドとは

ターミナルセッションを丸ごとファイルに録画するコマンド。1970年代から Unix に入っている古参。

使い所

  • 学習: 自分が何を打ったか後で見返せる(今やってること)
  • 障害対応: 「本番でどんなコマンド叩いたか」記録として残す(監査・再現用)
  • 教育: 操作手順を後輩に渡す時、画面録画より軽くて検索可能

終了は exit。終了するとファイルにすべての出力が保存されている。

1. 自分の現在地を知る

pwd     # print working directory - 現在のフルパス
whoami  # ログイン中のユーザー名
hostname  # マシン名

なぜ「現在地」を意識するのか

ターミナルは常に「どこかのディレクトリの中」にいる。これを「カレントディレクトリ(current directory)」と呼ぶ。ファイル操作はカレントディレクトリ基準で動く。

例: rm tmp.txt を実行すると、「カレントディレクトリの tmp.txt」を削除する。違う場所にいたら違う tmp.txt を消す。だから「今どこ?」を確認する pwd は最重要コマンド。

pwd の中身: シェルが持っている環境変数 $PWD の中身を表示しているだけ。echo $PWD でも同じ結果が出る。

whoami のユースケース: SSH で複数サーバーに繋いでいて「あれ、今 root で繋いでる?一般ユーザー?」が分からなくなった時の保険。本番サーバーで root と一般を取り違えると事故る。

2. 中身を見る(ls の使い倒し)

ls           # 中身一覧
ls -l        # 詳細(権限・サイズ・日時)
ls -a        # 隠しファイルも表示(. で始まるやつ)
ls -lh       # human readable(KB/MB単位)
ls -lt       # 更新日時順
ls -lS       # サイズ順
ls -la ~/    # ホームディレクトリの詳細

ls の各オプションの意味と使い分け

  • -l (long): 「詳細表示」。権限・所有者・サイズ・更新日時が出る。本番サーバーでは99%これls 単独だとほぼ使わない
  • -a (all): 隠しファイル(. で始まる)も出す。.git/ .env .bashrc などは設定ファイル系で重要
  • -h (human): サイズを 4.0K 2.3M 1.1G のように読める形式に。-l と必ずセットで使う
  • -t (time): 更新日時順。ログを追う時の鉄板。「直近で変更されたファイルどれ?」
  • -S (size): サイズ順。「ディスク食ってるファイル特定」の入り口
  • -r (reverse): 並び順を逆に。-tr で「古い順」、-Sr で「小さい順」

実務でよく見る組み合わせ: ls -lah (詳細+隠しも+読めるサイズ)。これだけ覚えればOK

ユースケース: アプリのエラーでログを調べる時、/var/log/ls -lt すると最新のログが先頭に来る → 怪しいファイルがすぐ分かる

ls -l の出力、左から何の情報?

実際に ls -l ~/ を打つとこんなのが出る:

drwxr-xr-x@  3 takato  staff    96 May 14 16:02 Documents
-rw-r--r--@  1 takato  staff  1234 May 14 16:00 memo.txt
lrwxr-xr-x   1 takato  staff    14 May 14 16:00 link.txt -> memo.txt

各列の意味、左から順に:

意味
1drwxr-xr-x@ファイルタイプ + 権限(後で詳しく)
23ハードリンク数(ディレクトリは中身の数。深く考えなくていい)
3takato所有者(このファイルを作った人)
4staffグループ(共有相手のグループ)
51234サイズ(バイト。-lh だと 1.2K などに)
6May 14 16:00最終更新日時
7memo.txtファイル名(リンクなら -> 実体 も付く)

左端1文字目: ファイルタイプ

  • - : 通常のファイル
  • d : ディレクトリ
  • l : シンボリックリンク(後の章で扱う)

残り9文字: 権限。rwxr-xr-x のように3文字ずつ3組

  • 最初の3文字 rwx : 所有者(owner)の権限
  • 次の3文字 r-x : グループ(group)の権限
  • 最後の3文字 r-x : その他(others / world)の権限

各3文字の意味:

  • r (read): 読める
  • w (write): 書ける(または削除できる)
  • x (execute): 実行できる(ディレクトリの場合は「中に入れる」)
  • - : その権限が無い

読み方の例: -rw-r--r--

  • 通常ファイル
  • 所有者: 読み書きOK、実行はNG
  • グループ: 読みのみ
  • その他: 読みのみ

いわゆる「自分しか書き換えられない、みんな読める」状態。設定ファイルでよくある。

末尾の @: macOS 独自の「拡張属性あり」マーク。気にしなくていい

詳細は Day3: パーミッション で扱う。今は「rwx の3組セット」というイメージだけ掴めばOK

3. 移動する(cd)

cd ~              # ホームへ
cd /              # ルートへ
cd ..             # 1つ上
cd -              # 直前のディレクトリへ戻る(神オプション)
cd ~/Documents    # 絶対パスっぽく書く

cd の便利ワザ

  • 引数なしの cd = cd ~ と同じ(ホームに戻る)。最速のホーム帰還
  • cd - = 直前のディレクトリに戻る。「あ、戻りたい」が一発で叶う。何回叩いても2箇所を行き来する
  • cd .. は「親ディレクトリ」、cd ../.. で「親の親」と重ねられる

ユースケース: プロジェクトディレクトリで作業中、別フォルダの設定見たくなった → cd /etc/nginx → 設定確認 → cd - で元の場所へ即帰還

絶対パスと相対パス

  • 絶対パス: /Users/takato/Documents のように / から始まる完全アドレス
  • 相対パス: Documents のようにカレントディレクトリからの場所指定
  • 相対パスはタイプ量少ない、絶対パスはどこにいても確実。スクリプト書く時は絶対パス推奨(カレントが変わると壊れるため)

4. ファイルの中身をのぞく

cat ~/.zshrc       # 全部出力
less ~/.zshrc      # 1画面ずつ(qで抜ける、/で検索)
head -20 ~/.zshrc  # 先頭20行
tail -20 ~/.zshrc  # 末尾20行
tail -f /var/log/system.log  # リアルタイム追従(Ctrl+Cで止める)

「ファイルを見る」コマンドが4つもある理由

コマンドこういう時に使う
cat短いファイル(設定ファイル、README)。中身を全部一気に標準出力へ流す
less長いファイルを読む時。スクロール・検索ができる
head先頭だけ見たい時。「このCSVのカラム名なんだっけ」「ログの最初は何?」
tail末尾だけ見たい時。ログ調査の基本。エラーは大体最後にある

最重要: tail -f

  • -f は follow(追跡)の意味
  • ファイルに新しい行が追記されるのをリアルタイムで表示する
  • 本番のエラー調査で一番使う: tail -f /var/log/nginx/error.log でnginxのエラーを生中継
  • 止め方は Ctrl+C

cat の落とし穴

巨大なファイル(数百MB以上)に cat するとターミナルが固まる。サイズ分からないファイルはまず ls -lh で確認 → 大きそうなら lesshead

less の操作

  • スペース / f: 次のページ
  • b: 前のページ
  • g: 先頭へ
  • G: 末尾へ
  • /検索語: 検索(n で次、N で前)
  • q: 終了

5. ディレクトリ構造を見る(tree)

# tree が入ってなければ
brew install tree
 
# ホームのトップ階層だけ
tree -L 1 ~
 
# Documents の2階層まで
tree -L 2 ~/Documents
 
# 隠しファイル除外、ファイル数カウント
tree -L 2 --noreport ~/Documents

tree は標準コマンドではない

macOSにも多くのLinuxディストリにも初期では入っていない。brew install tree で入れる外部ツール。

なぜ重要かというと、プロジェクトの全体像を把握するのに最強だから。README.mdtree の出力を貼って構造を説明している OSS プロジェクトは無数にある。

-L (level): 何階層まで掘るかの指定。-L 1 だと直下のみ、-L 3 だと3階層

代替手段: tree がない環境では find . -type d でディレクトリだけ列挙 → awk で整形 でそれっぽくできる。が、面倒なので素直に brew install を推奨


セッション②: 作成と整理(25分)

6. ディレクトリ・ファイルを作る

# 作業用フォルダ作成
mkdir -p ~/learn/linux/day01
cd ~/learn/linux/day01
 
# 空ファイル
touch hello.txt
touch a.txt b.txt c.txt   # 複数同時
 
# echo でテキスト書き込み
echo "Linux始めた" > memo.txt
echo "2行目" >> memo.txt   # 追記
cat memo.txt

mkdir -p-p って何?

  • -pparents(親)の意味
  • 「途中の親ディレクトリも一緒に作る」オプション

例:

mkdir ~/a/b/c          # NG: ~/a がなければエラー「親ディレクトリがない」
mkdir -p ~/a/b/c       # OK: ~/a も ~/a/b も同時に作って、その下に c も作る

もうひとつの便利な性質: 既に存在してもエラーにならない。スクリプトで「あれば使う、なければ作る」の処理に最適。明示的な if 文が要らない

実務ユースケース

  • 新規プロジェクト構造を一発生成: mkdir -p myproject/{src,tests,docs}/
  • デプロイスクリプトで「ログ置き場が無ければ作る」: mkdir -p /var/log/myapp

touch は本来「タイムスタンプ更新」コマンド

名前から「ファイル作成コマンド」だと思いがちだが、本来は ファイルの更新日時を「今」に書き換えるコマンド

touch existing_file.txt   # 既存ファイルの更新日時を今に変更
touch new_file.txt        # ファイルが存在しなければ作る(副作用的に)

「タイムスタンプ更新」って何の意味があるの?と思うが、実務では:

  • ビルドツールに「このファイル更新したよ」と認識させる(make などは更新日時で再ビルド判断する)
  • cron で「ファイルが古かったら再生成」のロジック

空ファイル作成は touch の副作用利用。厳密にはちょっと邪道な使い方だが、Unix 文化として定着している

echo は「画面に文字を出すだけ」のコマンド

単独だと「ターミナルに文字表示」というだけの地味なコマンドだが、シェルスクリプトでは超頻出。

使われ方トップ3

  1. 変数の中身を確認: echo $PATH で環境変数 PATH を見る
  2. ファイルに書き込む: echo "text" > file.txt(リダイレクト > でファイルに流す)
  3. デバッグ出力: スクリプト中で echo "ここまで来た" と入れて動作確認

>>> の違い(事故注意)

  • > : ファイルを 上書き(既存内容を消して新規書き込み)
  • >> : ファイルに 追記(既存内容の末尾に追加)

これを混同すると「設定ファイル全部消した」事故が起きる。覚え方: 矢印1本は「全部入れ替え」、2本は「重ねがけ」

7. ちょっと深いディレクトリも一発で

mkdir -p ~/learn/linux/{day01,day02,day03}/{src,docs,tests}
tree -L 3 ~/learn/linux

{a,b,c} はコマンドではなく シェルのブレース展開

{a,b,c} はシェル(zsh / bash)がコマンドに渡す前に勝手に展開する記法。mkdir 自体は何も知らない。

mkdir -p ~/{a,b,c}
# ↓ シェルが展開
mkdir -p ~/a ~/b ~/c
# ↑ これが実際に実行される

ネストもできる:

mkdir -p src/{api,web}/{handlers,models}
# ↓ 展開後
mkdir -p src/api/handlers src/api/models src/web/handlers src/web/models

実務ユースケース

  • 新規プロジェクトの構造作成(上の src/{api,web}/... パターン)
  • 連番ファイル作成: touch report_{2024,2025,2026}_{01..12}.md で年×月の36ファイル
  • バックアップ: cp config.yml{,.bak}cp config.yml config.yml.bak に展開

8. man で公式マニュアル

man ls    # ls のマニュアル(qで抜ける)
man cd
man tree

man (manual) は すべてのコマンドの公式説明書

インターネットがない時代から Unix に組み込まれている。今でもサーバー上で困った時のリファレンス。

使い方

  • 起動: man <コマンド名>
  • 操作は less と同じ(スペースで次へ、q で抜ける、/検索語 で検索)
  • セクション分け: NAME / SYNOPSIS / DESCRIPTION / OPTIONS / EXAMPLES(末尾にあると神)

実用度: 正直 macOS では Claude/Google に聞く方が早いが、SSHしたLinuxサーバーには man しかないことが多い。本番でネット使えない場面の保険として覚えておく

同じ機能の代替: --help フラグ(例: ls --help)も多くのコマンドで使える。こっちの方が短くて読みやすい

9. 自分のホームディレクトリを可視化する課題

# 自分のホームを覗いてみる
tree -L 2 ~ | less

観察課題(メモを残す):

  • どこに何があるか把握できる?
  • 不要そうなフォルダ・ファイルはある?
  • 自分が散らかしてる場所は?

見つけたことを下の「今日の発見」に書く


締め: コミットと振り返り(10分)

1. セッション録画を終了

exit   # script コマンドから抜ける

~/log/linux_day01.log に今日打った全コマンドが残ってる。

2. 今日の発見(このノートに追記)

- 学んで一番「へぇ」だったコマンド:
- 自分のホームディレクトリで気づいたこと:
- 詰まったところ:
- 明日やりたいこと:

3. デイリーノートにコピー

テンプレデイリー/2026-05-14.md のようにコピーして埋める。


チェックリスト

  • pwd ls cd を使ってホームを散歩した
  • tree -L 2 ~ で構造を見た
  • ~/learn/linux/day01/ を自分で作った
  • script でログを残した
  • このノートの「今日の発見」を埋めた

詰まった時のチートシート

やりたいことコマンド
今どこ?pwd
中身見たいls -la
移動したいcd <パス>
1つ上に戻るcd ..
ホームに戻るcd または cd ~
直前の場所に戻るcd -
ファイル作るtouch <名前>
フォルダ作るmkdir -p <パス>
中身見る(短い)cat <ファイル>
中身見る(長い)less <ファイル>
検索(中身)grep "文字列" <ファイル>
構造見るtree -L 2
やめる(多くの場面)q または Ctrl+C

おまけ: 「これって何ができれば実務OKなの?」基準

このレッスンで身に付くべき感覚:

  • ls -lh を息するように打てる: ファイル状況を確認する時の脊髄反射コマンド
  • tail -f の使い所が見えている: ログ調査の入口、ここで詰まらない
  • mkdir -pcd でディレクトリを行き来できる: 開発作業の土台
  • ブレース展開 {a,b,c} で複数生成ができる: シェルの強力さを体感
  • ファイルの中身を見るコマンドを使い分けられる: cat / less / head / tail

これができれば「最低限ターミナルが使える人」。明日 Day2 で cp / mv / rm / find を覚えると「ファイル操作が一通りできる人」になります。


次のレッスン

まだ level1_02_file_operations.md は無い。明日 Claude Code に次のように頼んで生成させる:

バックエンドマスター/Linux/level1_02_file_operations.md を、
level1_01_terminal_basics.md と同じフォーマットで作って。
内容は cp / mv / rm / find / ln(シンボリックリンク)中心で、
各コマンドに「これは何か」「いつ使うか」「落とし穴」を必ず含めて。