第2部 ターミナルとシェル
第5章 Linux/macOSのコマンドライン(bash/zsh)
前章でターミナルを開けるようになりました。いよいよ、実際に打てるコマンドを一つずつ身につけていきます。ファイルを探して、中身を見て、加工して、権限を整える——ここで学ぶ十数個のコマンドは、サーバー管理やログ調査といった実務のほぼすべての場面で使う「一生モノの道具」です。手元のターミナル(Linux・macOS、あるいはWindowsのWSL)を開いて、一行ずつ必ず自分で打ちながら読み進めてください。
🎯 この章で学ぶこと
- ファイルシステムを歩く(
pwd・ls・cdと、絶対パス/相対パス) - ファイルとディレクトリの基本操作(作成・コピー・移動・削除・中身表示)
- 中身を検索する(
grep)・ファイルを探す(find)・数える(wc) - パイプ
|とリダイレクト>でコマンドをつなぎ、出力をファイルへ導く - パーミッション(
rwx)の読み方とchmod・chown・sudo - 環境変数とPATH、そして日々を楽にする便利技(
history・alias)
5.1 ファイルシステムを歩く
ターミナル操作の基本は「移動」です。あなたは常にどこかのフォルダ(ディレクトリ)の中に立っており、そこを起点にコマンドが動きます。まずは自在に歩き回れるようになりましょう。
pwd — 今どこにいるか
pwd(print working directory)は現在地を表示します。迷子になったら、まずこれです。
$ pwd
/home/taro
ls — 中身を一覧する
ls(list)は、今いる場所にあるファイルとフォルダを一覧します。よく使うオプションを覚えると、見える情報が一気に増えます。
| オプション | 働き |
|---|---|
-l | 詳細表示(権限・所有者・サイズ・更新日時を1行ずつ) |
-a | . で始まる隠しファイルも表示する |
-h | サイズを人間に読みやすい単位(K・M・G)で表示。-l と併用 |
$ ls
Documents Downloads memo.txt report.sh
$ ls -lh
合計 12K
drwxr-xr-x 2 taro taro 4.0K 7月 8 10:00 Documents
drwxr-xr-x 2 taro taro 4.0K 7月 7 18:30 Downloads
-rw-r--r-- 1 taro taro 240 7月 8 09:15 memo.txt
-rwxr-xr-x 1 taro taro 512 7月 6 14:20 report.sh
先頭の drwxr-xr-x のような記号がパーミッション(アクセス権)で、読み方は5.5で詳しく学びます。d で始まる行はディレクトリ(フォルダ)です。
cd — 移動する
cd(change directory)で別のフォルダへ移動します。特別な記号を覚えると移動が速くなります。
| 書き方 | 移動先 |
|---|---|
cd Documents | 今いる場所の中の Documents へ |
cd .. | 一つ上の階層(親ディレクトリ)へ |
cd ~ | ホームディレクトリ(自分の定位置)へ。cd だけでも同じ |
cd - | 直前にいた場所へ戻る(行ったり来たりに便利) |
cd / | ファイルシステムの最上位(ルート)へ |
$ cd Documents
$ pwd
/home/taro/Documents
$ cd ..
$ pwd
/home/taro
絶対パスと相対パス
ファイルやフォルダの「住所」の書き方には2種類あります。この違いは非常に重要です。
- 絶対パス — ルート(
/)から書く、どこから見ても変わらない完全な住所。例:/home/taro/Documents。「日本国 東京都 千代田区…」のような正式住所 - 相対パス — 今いる場所を基準にした住所。例:
Documentsや../Downloads。「ここから2つ隣」のような言い方
. は「今いる場所」、.. は「一つ上」を表します。相対パスは短く書けて便利ですが、今どこにいるか(pwd)で意味が変わります。スクリプトや手順書では、環境に左右されない絶対パスのほうが安全なことが多いです。
5.2 ファイルとディレクトリの操作
歩けるようになったら、次は作る・写す・動かす・消すです。日常作業の中心になるコマンドたちです。
| コマンド | 働き | 例 |
|---|---|---|
mkdir | ディレクトリを作る | mkdir project |
touch | 空ファイルを作る(既存なら更新日時だけ更新) | touch memo.txt |
cp | コピーする | cp memo.txt memo_bak.txt |
mv | 移動する / 名前を変える | mv memo.txt Documents/ |
rm | 削除する | rm memo.txt |
$ mkdir project
$ touch project/notes.txt
$ ls project
notes.txt
$ cp project/notes.txt project/notes_bak.txt
$ mv project/notes.txt project/todo.txt
$ ls project
notes_bak.txt todo.txt
フォルダごとコピーしたいときは cp -r(recursive:中身を再帰的に)を使います。rm も、フォルダを消すには -r が必要です。
中身を見る — cat / less / head / tail
ファイルを開くにも用途別のコマンドがあります。
| コマンド | 働き | 向いている場面 |
|---|---|---|
cat | 中身を全部一気に表示する | 短いファイルをさっと確認 |
less | 1画面ずつスクロールして表示(qで終了) | 長いファイルをじっくり読む |
head | 先頭から数行だけ表示(既定10行) | ファイルの冒頭だけ確認 |
tail | 末尾から数行だけ表示(既定10行) | ログの最新部分を見る |
$ cat memo.txt
買い物リスト
- 牛乳
- パン
$ head -n 3 access.log # 先頭3行だけ
$ tail -n 20 access.log # 末尾20行だけ
tail に -f(follow)を付けると、追記されるログをリアルタイムに流し見できます(tail -f access.log)。障害調査の定番です。止めるときは Ctrl + C(第4章)です。
rm は「即・確認なし・元に戻せない」
GUIの削除はゴミ箱を経由しますが、rm は多くの場合その場で完全に消し、元に戻せません。特に危険なのが rm -r(フォルダごと再帰削除)と、確認を省く -f(force)を重ねた rm -rf です。rm -rf / のような打ち間違いは、システム全体を消し飛ばしかねません。消す前に必ず pwd と ls で「今どこで、何を消そうとしているか」を確認してください。不安なら rm -i(1件ずつ確認)を使う習慣が身を守ります。
5.3 中身を見る・探す
ファイルが増えてくると、「あの文字列を含む行はどこか」「あのファイルはどこに置いたか」を探す力が効いてきます。
grep — 文字列で行を絞り込む
grep は、ファイルの中から指定した文字を含む行だけを抜き出します。実務で最もよく使うコマンドの一つです。grep 探したい文字 ファイル名 の形で使います。
$ grep ERROR access.log
2026-07-08 10:15:02 ERROR database timeout
2026-07-08 10:16:44 ERROR connection refused
よく使うオプションを覚えておきましょう。
| オプション | 働き |
|---|---|
-i | 大文字小文字を区別しない(error も ERROR も拾う) |
-n | マッチした行の行番号も表示する |
-r | フォルダ内を再帰的に(サブフォルダも)検索する |
-v | 逆に、その文字を含まない行を表示する |
find — 条件でファイルを探す
grep が「中身」を探すのに対し、find は「ファイルそのもの」を名前や種類で探します。find 探す場所 条件 の形です。
$ find . -name "*.txt"
./memo.txt
./project/todo.txt
./Documents/plan.txt
これは「今いる場所(.)以下から、名前が .txt で終わるファイルをすべて探せ」という意味です。* はワイルドカードで、「任意の文字の並び」を表します。*.txt なら「何であれ .txt で終わるもの」です。
wc — 行数・単語数・文字数を数える
wc(word count)は、行数・単語数・バイト数を数えます。-l を付けると行数だけを数えます。これは次節のパイプと組み合わせると絶大な威力を発揮します。
$ wc -l access.log
1284 access.log
* は ls や rm、cp などにも使えます。ls *.log で拡張子が .log のファイルだけ一覧、cp *.txt backup/ でテキストファイルをまとめてコピー、といった具合です。ただし rm *.txt のように削除で使うときは、実行前に ls *.txt で対象を確認してから消すのが安全です。
5.4 パイプとリダイレクト — コマンドをつなぐ
ここが、シェルが単なる「命令実行機」を超える理由です。小さなコマンドを組み合わせて、大きな仕事をこなします。UNIXの世界には「一つのことをうまくやる小さな道具を、つないで使う」という思想があり、その接着剤がパイプとリダイレクトです。しっかり身につけましょう。
パイプ | — 出力を次のコマンドへ渡す
パイプ記号 | は、あるコマンドの出力を、次のコマンドの入力に流し込みます。「ホースでつなぐ」イメージです。たとえば「ls -l の結果のうち、.txt を含む行だけ見たい」なら、ls -l の出力を grep に流します。
$ ls -l | grep .txt
-rw-r--r-- 1 taro taro 240 7月 8 09:15 memo.txt
-rw-r--r-- 1 taro taro 512 7月 7 11:02 plan.txt
パイプはいくつでもつなげます。実務で頻出するのが、次の「ログからERRORの行を抜き出して、その件数を数える」という一連の流れです。
$ cat access.log | grep ERROR | wc -l
7
読み下すと、①cat access.log でログ全体を出し、②その出力を grep ERROR に流してERRORの行だけに絞り、③さらに wc -l に流して行数を数える——「このログにはエラーが7件あった」と一目で分かります。小さな道具を鎖のようにつなぐ、これがCLIの醍醐味です。
リダイレクト > >> — 出力をファイルへ導く
コマンドの結果は通常は画面に出ますが、リダイレクトを使うと出力先をファイルに変えられます。
| 記号 | 働き | 注意 |
|---|---|---|
> | 出力をファイルに書き込む | 既存の中身は上書き(消える) |
>> | 出力をファイルの末尾に追記する | 既存の中身は残る |
< | ファイルの中身をコマンドの入力として与える | 入力のリダイレクト |
$ echo "1行目のメモ" > note.txt # note.txt に書き込む(上書き)
$ echo "2行目を追加" >> note.txt # 末尾に追記する
$ cat note.txt
1行目のメモ
2行目を追加
先ほどのエラー件数の例も、結果をファイルに残せます。パイプとリダイレクトは併用できます。
$ grep ERROR access.log > errors.txt # ERRORの行だけを errors.txt に保存
> は既存ファイルを問答無用で上書きする
> は、書き込み先にすでに中身があっても確認なしで消して上書きします。大事なファイルに向けて > を使うと、一瞬で中身が失われます。追記したいだけなら、必ず >> を使ってください。1文字の違いですが、結果は天と地ほど違います。
標準エラー出力 2> — エラーだけを分ける
コマンドの出力には、実は2種類あります。通常の結果である標準出力と、エラーメッセージが流れる標準エラー出力です。番号で表され、標準出力が 1、標準エラー出力が 2 です。2> と書くと、エラーメッセージだけを別ファイルに振り分けられます。
$ find / -name "secret" > found.txt 2> errors.txt
この例では、見つかったファイルの一覧は found.txt に、「Permission denied(権限がなくて見られない)」などのエラーは errors.txt に、別々に書き込まれます。エラーを完全に捨てたいときは、2> /dev/null と書きます(/dev/null は「捨て場」を意味する特別な場所です)。両方を一つにまとめたいときは 2>&1 と書き、「標準エラーを標準出力と同じ先へ」と指示します。
5.5 パーミッション — 「誰が何をできるか」
第3章で学んだ「ユーザーと権限」の考え方が、ここで実物として現れます。Linux / macOSでは、すべてのファイルに「誰が・読み書き実行できるか」という設定が付いています。これがパーミッション(アクセス権)です。
ls -l に現れる rwx の読み方
ls -l の各行の先頭にある -rwxr-xr-- のような10文字が、パーミッションの表示です。次のように区切って読みます。
- rwx r-x r--
種類 所有者 グループ その他
- 1文字目 … 種類。
-は通常ファイル、dはディレクトリ - 次の3文字 … 所有者(owner)の権限
- 次の3文字 … グループ(group)の権限
- 最後の3文字 … その他(other)の権限
各3文字は r(read:読み取り)・w(write:書き込み)・x(execute:実行)の並びで、権限があれば文字、なければ - になります。
| 表示 | 意味 |
|---|---|
rwx | 読み・書き・実行のすべてが可能 |
r-x | 読みと実行はできるが、書き込みは不可 |
r-- | 読み取りのみ可能 |
--- | 何もできない |
たとえば -rwxr-xr-- は「通常ファイルで、所有者は読み書き実行すべて可、グループは読みと実行のみ、その他は読み取りのみ」という意味になります。
数値(8進数)での表し方
権限は数字でも表せます。r=4、w=2、x=1 として、各グループごとに足し算します。rwx なら 4+2+1=7、r-x なら 4+0+1=5、r-- なら 4 です。3つ並べて3桁の数にします。
| 数値 | 記号 | 典型的な用途 |
|---|---|---|
755 | rwxr-xr-x | 実行ファイルやフォルダ(本人は全部、他は読み・実行のみ) |
644 | rw-r--r-- | 普通のデータファイル(本人は読み書き、他は読みのみ) |
600 | rw------- | 本人だけが読み書き。秘密鍵など、他人に見せたくないファイル |
777 | rwxrwxrwx | 全員が何でもできる。危険なので原則使わない |
chmod — 権限を変える
chmod(change mode)で権限を変更します。数値形式と記号形式の2つの指定方法があります。
$ chmod 755 report.sh # 数値で一括指定
$ chmod u+x report.sh # 記号形式:所有者(u)に実行(x)を追加
$ chmod go-w memo.txt # グループ(g)とその他(o)から書き込み(w)を剥奪
記号形式は u(所有者)・g(グループ)・o(その他)・a(全員)に対し、+(追加)・-(削除)・=(その通りに設定)で権限を足し引きします。chmod +x script.sh は「このスクリプトを実行できるようにする」定番の操作です。
chown と sudo
chown(change owner)はファイルの所有者を変えます。chown ユーザー:グループ ファイル の形です。所有者の変更は強い操作なので、多くの場合管理者権限が必要です。そこで登場するのが sudo(superuser do)で、コマンドの先頭に付けると、その一回だけ管理者として実行できます。
$ sudo chown taro:staff report.sh
[sudo] password for taro:
sudo は「安全装置を外す」操作
sudo を付けたコマンドは、パーミッションの制限を飛び越えて何でもできてしまいます。前述の rm -rf に sudo が付けば、システムファイルさえ消せます。sudo を使うときは、そのコマンドが何をするかを完全に理解してから実行してください。ネット上のコマンドを意味も分からず sudo でコピペ実行するのは、最も危険な習慣です(第4章のコピペ実行の話)。
5.6 環境変数とPATH
シェルは、設定値を環境変数という名前付きの箱に持っています。$ を付けて参照し、echo で中身を見られます。第4章で見た $SHELL もその一つです。
$ echo $HOME
/home/taro
$ echo $USER
taro
PATH — シェルがコマンドを探す場所のリスト
数ある環境変数の中でも特に重要なのが PATH です。あなたが ls と打つとき、シェルは ls というプログラムの本体を、PATH に列挙されたフォルダの中から順に探して実行しています。中身を見てみましょう。
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
コロン : 区切りで、コマンドを探すフォルダが並んでいます。ここに載っていない場所のプログラムは、名前だけでは呼び出せず、第4章で見た command not found になります。「コマンドが見つかりません」の正体は、多くの場合この PATH 問題です。自分で入れたツールが動かないときは、そのツールの置き場所が PATH に含まれているかを疑います。
一時的に環境変数を設定・追加するには export を使います。次は「PATH の先頭に、自分のツール置き場を追加する」例です。
$ export PATH="$HOME/bin:$PATH"
ただし export でのこの設定は、そのターミナルを閉じると消えます。毎回自動で効かせたいときは、次節の設定ファイルに書きます。
5.7 便利技で日々を楽にする
最後に、作業の効率を大きく上げる小技を紹介します。
history — 打ったコマンドの記録
history は、これまで実行したコマンドの一覧を番号付きで表示します(第4章の ↑ キーは、この履歴を1つずつ呼び出す操作でした)。grep と組み合わせれば、過去に打った特定のコマンドをすぐ探せます。
$ history | grep chmod
512 chmod 755 report.sh
537 chmod +x deploy.sh
sort と uniq — 並べ替えと重複の集計
sort(並べ替え)と uniq(連続する重複をまとめる)は、パイプと組み合わせる定番の道具です。uniq -c は各行の出現回数を数え、sort -rn は数値で大きい順に並べます。「ログに出てくるIPアドレスを、多い順に集計する」といった分析が一行で書けます。
$ cat access.log | grep ERROR | sort | uniq -c | sort -rn
4 ERROR database timeout
3 ERROR connection refused
alias — 長いコマンドに短い別名を付ける
よく使う長いコマンドには alias で短い名前を付けられます。たとえば ll と打つだけで ls -la が動くようにできます。
$ alias ll="ls -la"
$ ll # これで ls -la が実行される
設定ファイル .bashrc / .zshrc
alias や export をその場で打つと、ターミナルを閉じたとたんに消えてしまいます。毎回自動で効かせたい設定は、ホームディレクトリにある設定ファイルに書いておきます。bashなら ~/.bashrc、zshなら ~/.zshrc です(先頭が . の隠しファイルなので、ls -a で見えます)。ここに alias ll="ls -la" のように書いておけば、次回以降ターミナルを開くたびに自動で読み込まれます。「自分好みのターミナル」は、この一行ずつの積み重ねで育っていきます。
パーミッションは、地味ですが多層防御(何重にも守りを重ねる考え方)の一枚です。仮にサーバーに侵入されても、重要ファイルが 600(本人しか読めない)で守られていれば、被害を一段抑えられます。逆に、面倒だからと chmod 777 で「全員に全権限」を与えるのは、鍵を開けっぱなしにするのと同じです。秘密鍵や設定ファイルの権限は、必要最小限(最小権限の原則)に絞るのが鉄則です。
そして本章のコマンドは、そのまま実務のログ解析の道具になります。「エラーは何件か」「直近で何が起きたか」を、grep で絞り、tail で最新を見て、wc -l で数え、sort | uniq -c で集計する——これは 🐍 入門コースで学ぶログ解析とまったく同じ発想を、コマンド一行で実現するものです。障害対応の現場では、tail -f で流れるログを見張りながら grep で異常を拾う、という操作が日常的に行われます(サーバー運用の実務は第14章)。ここで手に馴染ませたパイプの感覚が、そのまま現場で武器になります。
まとめ
pwd・ls・cdでファイルシステムを歩く。住所には絶対パスと相対パス(.=今、..=一つ上)があるmkdir・cp・mv・rmで作成・複製・移動・削除。rm -rfは即・確認なし・復元不可で危険grep(中身を検索)・find(ファイルを検索)・wc(数える)・*(ワイルドカード)で探す- パイプ
|でコマンドをつなぎ、>/>>で出力をファイルへ。2>でエラーだけを分けられる - パーミッションは
rwx(所有者・グループ・その他)。chmod(755/644等)・chown・sudoで操作。最小権限が基本 - コマンドは
PATHのフォルダから探される。「見つかりません」の多くはPATH問題。aliasと.bashrc/.zshrcで作業を効率化
練習問題
ls -l の結果に、次の行が表示されました。パーミッション部分 -rw-r----- を、「所有者」「グループ」「その他」に分けて、それぞれ何ができるかを説明してください。また、これを8進数の数値で表すといくつになりますか。
-rw-r----- 1 taro staff 1024 7月 8 10:00 salary.csv
解答を見る
先頭の - は通常ファイルを表します。続く9文字を3つずつ区切ります。
- 所有者(taro):
rw-… 読み・書きは可、実行は不可 - グループ(staff):
r--… 読み取りのみ可 - その他:
---… 何もできない
数値では、rw-=4+2+0=6、r--=4+0+0=4、---=0 なので、640 です。給与ファイルのような機密情報を、所有者と同じグループの一部にだけ見せ、無関係な第三者には一切触らせない、妥当な設定といえます。
app.log というログファイルの中に、「WARNING」という文字を含む行が何行あるかを数えたいです。パイプを使って、1つのコマンドで実現してください。
解答を見る
$ cat app.log | grep WARNING | wc -l
cat app.log でログ全体を出力し、それを grep WARNING に流して「WARNING」を含む行だけに絞り、さらに wc -l に流して行数を数えます。より短く grep -c WARNING app.log と書くこともできます(grep -c は該当行数を直接数えるオプション)。どちらでも正解です。大文字小文字を問わず数えたいなら grep -i を加えます。
あなたは deploy.sh というスクリプトを作りましたが、実行しようとすると Permission denied と出て動きません。(1)原因として何が考えられ、(2)どのコマンドで解決できますか。また、(3)このスクリプトの実行結果を result.log というファイルに保存するにはどう書きますか。
解答を見る
(1) スクリプトファイルに実行権限(x)が付いていないことが原因と考えられます。ls -l deploy.sh で確認すると、パーミッションに x がないはずです。
(2) 実行権限を追加します。
$ chmod +x deploy.sh
(3) リダイレクト > で標準出力をファイルに書き込みます。
$ ./deploy.sh > result.log
実行結果に加えてエラーメッセージも一緒に残したい場合は、./deploy.sh > result.log 2>&1 と書きます。なお ./ は「今いる場所にあるこのファイル」を指す書き方で、PATH に含まれない場所のスクリプトを実行するときに必要です(5.6)。