🎯 この章で学ぶこと

  • ファイルシステムを歩く(pwdlscdと、絶対パス/相対パス)
  • ファイルとディレクトリの基本操作(作成・コピー・移動・削除・中身表示)
  • 中身を検索する(grep)・ファイルを探す(find)・数える(wc)
  • パイプ | とリダイレクト > でコマンドをつなぎ、出力をファイルへ導く
  • パーミッション(rwx)の読み方と chmodchownsudo
  • 環境変数とPATH、そして日々を楽にする便利技(historyalias)

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種類あります。この違いは非常に重要です。

. は「今いる場所」、.. は「一つ上」を表します。相対パスは短く書けて便利ですが、今どこにいるか(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中身を全部一気に表示する短いファイルをさっと確認
less1画面ずつスクロールして表示(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 / のような打ち間違いは、システム全体を消し飛ばしかねません。消す前に必ず pwdls で「今どこで、何を消そうとしているか」を確認してください。不安なら 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大文字小文字を区別しない(errorERROR も拾う)
-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
✅ ワイルドカードは操作コマンドにも効く

*lsrmcp などにも使えます。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--
種類 所有者 グループ その他

各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桁の数にします。

数値記号典型的な用途
755rwxr-xr-x実行ファイルやフォルダ(本人は全部、他は読み・実行のみ)
644rw-r--r--普通のデータファイル(本人は読み書き、他は読みのみ)
600rw-------本人だけが読み書き。秘密鍵など、他人に見せたくないファイル
777rwxrwxrwx全員が何でもできる。危険なので原則使わない

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 は「このスクリプトを実行できるようにする」定番の操作です。

chownsudo

chown(change owner)はファイルの所有者を変えます。chown ユーザー:グループ ファイル の形です。所有者の変更は強い操作なので、多くの場合管理者権限が必要です。そこで登場するのが sudo(superuser do)で、コマンドの先頭に付けると、その一回だけ管理者として実行できます。

$ sudo chown taro:staff report.sh
[sudo] password for taro:
⚠️ sudo は「安全装置を外す」操作

sudo を付けたコマンドは、パーミッションの制限を飛び越えて何でもできてしまいます。前述の rm -rfsudo が付けば、システムファイルさえ消せます。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

sortuniq — 並べ替えと重複の集計

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

aliasexport をその場で打つと、ターミナルを閉じたとたんに消えてしまいます。毎回自動で効かせたい設定は、ホームディレクトリにある設定ファイルに書いておきます。bashなら ~/.bashrc、zshなら ~/.zshrc です(先頭が . の隠しファイルなので、ls -a で見えます)。ここに alias ll="ls -la" のように書いておけば、次回以降ターミナルを開くたびに自動で読み込まれます。「自分好みのターミナル」は、この一行ずつの積み重ねで育っていきます。

🛡️ セキュリティ・運用の視点 — パーミッションは多層防御、ログ調査は grep と tail から

パーミッションは、地味ですが多層防御(何重にも守りを重ねる考え方)の一枚です。仮にサーバーに侵入されても、重要ファイルが 600(本人しか読めない)で守られていれば、被害を一段抑えられます。逆に、面倒だからと chmod 777 で「全員に全権限」を与えるのは、鍵を開けっぱなしにするのと同じです。秘密鍵や設定ファイルの権限は、必要最小限(最小権限の原則)に絞るのが鉄則です。

そして本章のコマンドは、そのまま実務のログ解析の道具になります。「エラーは何件か」「直近で何が起きたか」を、grep で絞り、tail で最新を見て、wc -l で数え、sort | uniq -c で集計する——これは 🐍 入門コースで学ぶログ解析とまったく同じ発想を、コマンド一行で実現するものです。障害対応の現場では、tail -f で流れるログを見張りながら grep で異常を拾う、という操作が日常的に行われます(サーバー運用の実務は第14章)。ここで手に馴染ませたパイプの感覚が、そのまま現場で武器になります。

まとめ

練習問題

問題 5-1

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=6r--=4+0+0=4---=0 なので、640 です。給与ファイルのような機密情報を、所有者と同じグループの一部にだけ見せ、無関係な第三者には一切触らせない、妥当な設定といえます。

問題 5-2

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 を加えます。

問題 5-3

あなたは 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)。