第2部 使いこなす
第4章 基本コマンドとファイル操作
いよいよLinuxのCLIを本格的に使い倒す章です。一覧・移動・作成・削除・検索、そして真骨頂であるパイプとリダイレクト。ここで基礎を固めれば、Linuxが「読める・書ける・調べられる」道具に変わります。
🎯 この章で学ぶこと
- ファイルの一覧・作成・削除・移動・コピーを自在に行う
- ファイルの中身を
cat/less/tail -fで読む findとgrepで、目的のファイルや行を探し出す- パイプ
|とリダイレクト>でコマンドをつなぎ、結果を保存する tarでバックアップを取り、manやTab補完で自走できるようになる
この章は、コンピュータ大全コース第5章のコマンドライン入門と内容が重なる部分があります。ですが、基礎は繰り返すほど身につくもの。重複を恐れず、Linuxの文脈でより丁寧に、一つずつ手を動かして固めていきましょう。
4.1 一覧と移動
まずは第3章でも触れた3つ、ls(一覧)、cd(移動)、pwd(現在地)。中でも ls は毎日いちばん使うコマンドで、オプションを付けることで表示を細かく変えられます。主要なものを押さえましょう。
| オプション | 意味 | 使いどころ |
|---|---|---|
-l | 詳細表示(long)。権限・所有者・サイズ・日時を縦に並べる | ファイルの素性を知りたいとき |
-a | 隠しファイルも含めて全部(all) | . で始まる設定ファイルを見たいとき |
-h | サイズを読みやすく(human)。4.0K や 1.2M と表示 | -l と組み合わせて容量を確認 |
-t | 更新日時が新しい順に並べる(time) | 最近いじったファイルを探すとき |
-R | サブディレクトリの中まで再帰的に表示(Recursive) | 階層まるごと見渡したいとき |
オプションは組み合わせられます。よく使う ls -lh(詳細+読みやすいサイズ)を打ってみましょう。
yuuki@ubuntu:~$ ls -lh
合計 24K
drwxr-xr-x 2 yuuki yuuki 4.0K 2月 3 10:12 documents
-rw-r--r-- 1 yuuki yuuki 15K 2月 3 09:40 report.pdf
-rw-r--r-- 1 yuuki yuuki 128 2月 1 18:22 memo.txt
先頭が d の行はディレクトリ、- はファイルです。「新しい順に、読みやすいサイズで」なら ls -lht のようにまとめて指定できます。オプションの順番は問いません。
ディレクトリを移動したら、まず ls。何かを操作する前にも、まず ls。今どこに、何があるのかを目で確かめる習慣は、消し間違いや上書き事故を防ぐいちばん簡単な予防策です。pwd と ls は、Linux操作の「安全確認」だと思ってください。
4.2 ファイルとディレクトリを作る・消す・動かす
ここからは実際にファイルを操作します。まずディレクトリを作る mkdir。-p を付けると、途中の階層もまとめて作ってくれます。
yuuki@ubuntu:~$ mkdir -p project/src/utils
yuuki@ubuntu:~$ ls -R project
project:
src
project/src:
utils
project/src/utils:
-p なしだと「途中の src がない」とエラーになりますが、-p があれば project → src → utils を一気に掘ってくれます。次に、空のファイルを作る touch。
yuuki@ubuntu:~$ touch memo.txt notes.txt
yuuki@ubuntu:~$ ls
memo.txt notes.txt project
コピーは cp、移動(や名前の変更)は mv です。ディレクトリをまるごとコピーするときは -r(recursive、中身ごと)を付けます。
yuuki@ubuntu:~$ cp memo.txt memo_backup.txt # ファイルを複製
yuuki@ubuntu:~$ cp -r project project_copy # ディレクトリごと複製
yuuki@ubuntu:~$ mv notes.txt project/ # project の中へ移動
yuuki@ubuntu:~$ mv memo.txt diary.txt # 名前を変更(移動の一種)
面白いのは、mv が「移動」と「名前変更」を兼ねる点です。同じ場所のまま別名を指定すれば、それは名前の変更になります。そして最後が、削除の rm(remove)です。
yuuki@ubuntu:~$ rm memo_backup.txt # ファイルを削除
yuuki@ubuntu:~$ rm -r project_copy # ディレクトリごと削除
rm にゴミ箱はない — 特に rm -rf は要注意
Windowsのゴミ箱と違い、Linuxの rm で消したものは即座に、完全に消えます。取り消しはできません。とりわけ rm -rf は「中身ごと(-r)、確認なしで強制的に(-f)」削除する非常に強力な組み合わせで、指定を1文字間違えただけで大量のファイルが一瞬で消えます。削除の前には必ず ls で対象を確認し、できるだけ絶対パスで、対象を正確に指定する。慣れてきた頃こそ油断は禁物です。
4.3 中身を見る
ファイルの中身を読むコマンドは、目的に応じて使い分けます。いちばん基本の cat は、中身を全部まとめて画面に流します。短いファイル向きです。
yuuki@ubuntu:~$ cat /etc/hostname
ubuntu
長いファイルを cat すると画面を一瞬で流れ去ってしまいます。そんなときは less で、1画面ずつじっくり読みます。less を開いたあとは、次のキーで操作します。
| キー | 動作 |
|---|---|
スペース / f | 次の画面へ(進む) |
b | 前の画面へ(戻る) |
↑ / ↓ | 1行ずつ移動 |
/文字列 | 下に向かって検索(例: /error) |
q | less を終了して元に戻る |
「最初の数行だけ見たい」「最後だけ見たい」なら head と tail が便利です。-n で行数を指定できます。
yuuki@ubuntu:~$ head -n 3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
yuuki@ubuntu:~$ tail -n 2 /var/log/syslog
Feb 3 12:00:01 ubuntu CRON[2841]: (root) CMD (cd / && run-parts /etc/cron.hourly)
Feb 3 12:01:14 ubuntu systemd[1]: Started Daily apt upgrade.
tail には運用でとても重宝する -f(follow)オプションがあります。これはファイルの末尾を表示したまま画面に居座り、新しい行が追記されるたびにリアルタイムで流し続けるもの。ログの監視に欠かせません。
yuuki@ubuntu:~$ tail -f /var/log/syslog
Feb 3 12:05:33 ubuntu sshd[3120]: Accepted password for yuuki from 192.168.1.10
Feb 3 12:05:47 ubuntu sudo: yuuki : COMMAND=/usr/bin/apt update
(新しいログが出るたびに、下へ下へと追記され続ける。止めるには Ctrl+C)
行数・単語数・文字数を数える wc(word count)も覚えておきましょう。-l で行数だけを数えられ、後述のパイプと組み合わせると威力を発揮します。
yuuki@ubuntu:~$ wc -l /etc/passwd
48 /etc/passwd
4.4 探す
ファイルが増えてくると、「どこに置いたっけ?」「あの単語を含むファイルは?」と探す場面が増えます。ここで活躍するのが find と grep です。この2つを使いこなせるかどうかで、作業効率が大きく変わります。
find — 名前・種類・日時でファイルを探す
find は「どこから 何を探すか」を指定します。書き方は find 探す場所 条件 です。まずは名前で探す例です。-name で名前の条件を、*(任意の文字列)と組み合わせます。
yuuki@ubuntu:~$ find . -name "*.txt"
./memo.txt
./project/notes.txt
./documents/todo.txt
.(今の場所)から下を全部たどって、.txt で終わるファイルを見つけてくれました。種類や更新日時でも絞れます。
yuuki@ubuntu:~$ find /var/log -type f -name "*.log" # ファイル(f)だけ
yuuki@ubuntu:~$ find . -type d # ディレクトリ(d)だけ
yuuki@ubuntu:~$ find . -mtime -1 # 過去1日以内に更新されたもの
grep — ファイルの「中身」から探す
find がファイル名を探すのに対し、grep はファイルの中身から、指定した文字列を含む行を抜き出します。書き方は grep 探す文字列 ファイル です。
yuuki@ubuntu:~$ grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
grep は、次の3つのオプションを覚えると一気に実用的になります。
| オプション | 意味 |
|---|---|
-r | ディレクトリ以下のファイルを再帰的に検索(recursive) |
-i | 大文字・小文字を区別しない(ignore case) |
-n | マッチした行の行番号も表示する(number) |
yuuki@ubuntu:~$ grep -rin "error" /var/log/
/var/log/syslog:88:Feb 3 11:20:03 ubuntu app[1201]: ERROR failed to connect
/var/log/nginx/error.log:5:2024/02/03 11:20:03 [error] upstream timed out
この一行で「/var/log 以下のすべてから、大小を問わず error を含む行を、行番号つきで」探せました。トラブル調査の第一手として、この形は本当によく使います。
which と locate — コマンドやファイルの場所
which は「そのコマンドの実体がどこにあるか」を教えます。locate は、あらかじめ作られた索引を使って、ファイルを高速に探します。
yuuki@ubuntu:~$ which ls
/usr/bin/ls
yuuki@ubuntu:~$ locate hosts
/etc/hosts
/etc/hosts.allow
/usr/share/doc/...
4.5 パイプとリダイレクト
ここがこの章の山場であり、Linuxがこれほど強力な理由の核心です。Linuxのコマンドは、一つひとつは小さな道具にすぎません。しかし パイプとリダイレクトで組み合わせることで、まるでレゴブロックのように、複雑な仕事を組み立てられます。第1章で触れた「シンプルな道具を組み合わせて大きな仕事をする」というUNIXの思想が、ここで形になります。
パイプ「|」 — コマンドの出力を次のコマンドへ渡す
パイプ記号 | は、左のコマンドの出力(結果)を、右のコマンドの入力として流し込む装置です。「あるコマンドの結果を、別のコマンドでさらに加工する」——これがパイプの働きです。たとえば、/etc の一覧から .conf を含む行だけを取り出すには、ls の結果を grep に流します。
yuuki@ubuntu:~$ ls /etc | grep conf
nsswitch.conf
resolv.conf
rsyslog.conf
読み下すと「ls /etc で一覧を出し(左)、その結果から grep conf で conf を含む行だけ残す(右)」となります。もう一つ、実務で頻出の例。ログから ERROR の行を取り出し、その件数を数えるには、grep の結果を wc -l に流します。
yuuki@ubuntu:~$ grep ERROR app.log | wc -l
14
「app.log の中で ERROR を含む行が14件あった」と分かりました。grep が該当行を抜き出し、wc -l がその行数を数える——2つの道具の連携です。パイプは何段でもつなげられます。
yuuki@ubuntu:~$ cat access.log | grep 404 | wc -l
57
リダイレクト「>」 — 結果をファイルに保存する
コマンドの結果は普通、画面に表示されます。これをファイルに書き出すのがリダイレクトです。記号 > を使うと、画面の代わりにファイルへ流し込めます。
yuuki@ubuntu:~$ echo "Hello Linux" > memo.txt
yuuki@ubuntu:~$ cat memo.txt
Hello Linux
ここで大事な注意があります。> は、ファイルが既にあると中身を丸ごと上書き(前の内容は消える)します。消さずに末尾へ追記したいときは、記号を2つ重ねた >> を使います。
yuuki@ubuntu:~$ echo "2行目を追記します" >> memo.txt
yuuki@ubuntu:~$ cat memo.txt
Hello Linux
2行目を追記します
| 記号 | 意味 |
|---|---|
> | 結果をファイルに書き出す(上書き。前の内容は消える) |
>> | 結果をファイルの末尾に追記する |
2> | エラーメッセージだけをファイルに書き出す |
2>&1 | エラーも通常の出力と同じ行き先へまとめる |
Linuxのコマンドは、結果を流す管を2本持っています。ふつうの結果を流す標準出力と、エラーメッセージを流す標準エラー出力です。> は前者だけを、2> は後者だけをファイルへ向けます。たとえば ls /nonexistent 2> error.log とすると、エラーが画面ではなく error.log に記録されます。両方まとめて1つのファイルに残したいときの決まり文句が 2>&1 で、「エラー(2)を、通常の出力(1)と同じ場所へ」という意味です。
これらを組み合わせると、たとえばバックアップ処理の結果を、エラーも含めてまるごとログに残せます。
yuuki@ubuntu:~$ ./backup.sh > backup.log 2>&1
「backup.sh の通常の出力を backup.log へ書き出し(>)、エラーも同じ backup.log へまとめる(2>&1)」。実行後に cat backup.log を見れば、何が起きたか一目で追えます。パイプとリダイレクトは、この先のシェルスクリプト(第8章)でも土台になる、最重要の道具です。
4.6 圧縮とアーカイブ
複数のファイルを1つにまとめたり、サイズを縮めたりする操作は、バックアップやファイルの受け渡しの基本です。Linuxの定番は tar(ター)です。名前は「テープアーカイブ」に由来しますが、今は「複数ファイルを1つの箱にまとめる」道具として使います。
まとめる(圧縮する)ときの決まり文句が tar czf です。オプションは c(create、作る)、z(gzipで圧縮)、f(ファイル名を指定)の組み合わせです。
yuuki@ubuntu:~$ tar czf backup.tar.gz documents/
yuuki@ubuntu:~$ ls -lh backup.tar.gz
-rw-r--r-- 1 yuuki yuuki 1.2M 2月 3 13:00 backup.tar.gz
documents/ ディレクトリまるごとが、backup.tar.gz という1つの圧縮ファイルにまとまりました。逆に、取り出す(展開する)ときは c を x(extract、取り出す)に変えて tar xzf です。
yuuki@ubuntu:~$ tar xzf backup.tar.gz
yuuki@ubuntu:~$ ls documents/
report.pdf todo.txt memo.txt
「czf で固めて、xzf で戻す」——この2つをセットで覚えれば、日々のバックアップに困りません。中身を確認だけしたいときは c/x の代わりに t(list、一覧)を使い tar tzf backup.tar.gz とします。
Windowsとやり取りする定番の zip 形式も使えます。
yuuki@ubuntu:~$ zip -r photos.zip photos/ # photos をまとめる
yuuki@ubuntu:~$ unzip photos.zip # 展開する
1つのファイルだけをその場で圧縮/解凍するなら gzip / gunzip が手軽です(gzip app.log で app.log.gz になります)。
4.7 ちょっと便利
最後に、日々の操作をぐっと楽にしてくれる小技を紹介します。これらを知っているだけで、コマンドライン作業のストレスが大きく減ります。
man と --help — 困ったら自分で調べる
コマンドの使い方を忘れたら、人に聞く前に自分で引けます。man(manual)は、そのコマンドの詳しい説明書を表示します(表示は less と同じ操作で、q で戻ります)。
yuuki@ubuntu:~$ man ls
LS(1) User Commands LS(1)
NAME
ls - list directory contents
...
もっと手早く要点だけ見たいときは --help を付けます。多くのコマンドが、主なオプションの一覧を短く表示してくれます。
yuuki@ubuntu:~$ ls --help
使用法: ls [オプション]... [ファイル]...
-a, --all . で始まる要素を無視しない
-l 詳細なリスト形式を表示する
...
Tab補完と履歴 — 打つ手間を減らす
Tabキーは、コマンドやファイル名の入力を途中まで打って押すと、残りを自動で補完してくれます。cd doc まで打って Tab を押せば、documents/ まで一気に埋まります。長い名前を全部打つ必要はありません。打ち間違いも防げます。
過去に打ったコマンドは history で一覧できます。↑ キーで一つ前のコマンドを呼び戻すのも定番です。
yuuki@ubuntu:~$ history
1 cd /etc
2 ls -la
3 grep root passwd
4 cd
5 history
覚えておきたいキー操作
| キー | 働き |
|---|---|
Tab | コマンド名・ファイル名を補完する |
Ctrl + C | 実行中のコマンドを中断する(tail -f を止めるなど) |
Ctrl + R | 過去のコマンドを文字列で逆検索する |
↑ / ↓ | コマンド履歴を1つずつたどる |
とくに Ctrl + R は便利です。押してから文字を打つと、その文字を含む過去のコマンドが浮かび上がります。長いコマンドを打ち直さずに再利用できます。
検索で見つけたコマンドを、意味を確かめずにコピー&ペーストで実行するのは危険です。世の中には rm -rf /(ルートから下を全消しする破滅的なコマンド)のように、システムを丸ごと壊すものが存在します。悪意ある投稿が、そうした危険なコマンドを一見無害な説明に紛れ込ませていることもあります。実行する前に、それが何をするコマンドかを、man や --help で確かめる。これだけで、多くの事故は防げます。
tail -f と grep はログ調査の必須技
「サーバーの調子がおかしい」「不正アクセスの疑いがある」——そんなとき、運用者がまず手を伸ばすのが、この章で学んだ tail -f と grep です。tail -f /var/log/auth.log でログインの動きをリアルタイムに監視し、grep "Failed password" /var/log/auth.log | wc -l でパスワード失敗の回数を数えれば、総当たり攻撃(ブルートフォース)の兆候をつかめます。第3章で「ログは /var/log」と学んだ知識が、ここで調査の技術としてつながります。地味な基本コマンドこそが、インシデント対応の最前線で物を言うのです。このログ解析の発想は、本コース第7章や、コンピュータ大全コース第14章「サーバー運用の実務」でさらに深めていきます。
まとめ
lsのオプション(-l -a -h -t -R)を使い分け、まず現在地を確認するクセをつける- 作成は
mkdir -p/touch、コピーはcp -r、移動・改名はmv、削除はrm。rm -rfは取り消せない - 中身は
cat/less/head/tailで読む。tail -fはログのリアルタイム監視に必須 - 探すのは
find(名前・種類・日時)とgrep -rin(中身から) - パイプ
|で道具をつなぎ、>/>>で保存・追記、2>/2>&1でエラーを扱う - バックアップは
tar czfで固め、tar xzfで戻す - 迷ったら
manと--help。Tab補完・履歴・Ctrl+C/Ctrl+Rで効率化
練習問題
ログファイル app.log の中で、文字列 WARNING を含む行が何行あるかを数えたいです。パイプを使った1行のコマンドを書いてください。
解答を見る
grep WARNING app.log | wc -l です。grep WARNING app.log が WARNING を含む行だけを抜き出し、その結果をパイプ | で wc -l に渡すことで、抜き出された行数(=WARNINGの件数)が数えられます。大文字・小文字を区別せず数えたいなら grep -i WARNING app.log | wc -l とします。
今いるディレクトリ以下から、拡張子が .log のファイルをすべて探し出すコマンドを書いてください。また、そのうえで > と >> の違いを一言で説明してください。
解答を見る
探すコマンドは find . -name "*.log" です。.(今の場所)を起点に、-name "*.log" で名前が .log で終わるファイルを再帰的に探します。> と >> の違いは、> はファイルを上書き(前の内容を消して書き直す)、>> は末尾に追記(前の内容を残して足す)することです。既存のログを消したくないときは >> を使います。
同僚が「ネットで見つけた」と言って、rm -rf / というコマンドを本番サーバーで試そうとしています。あなたはどう止めますか。このコマンドが何をするか、および安全に確認する方法を含めて説明してください。
解答を見る
rm -rf / は、ルート / から下のすべてを、確認なし(-f)で、中身ごと(-r)強制削除する破滅的なコマンドです。実行すればシステム全体が壊れ、rm にゴミ箱はないため復旧もできません。絶対に止めるべきで、まず「そのコマンドが何をするか」を man rm や --help で一緒に確認します。ネットで見つけたコマンドは意味を理解せずに実行しないこと、試すなら本番ではなくWSLやVMなどの壊してよい隔離環境で行うこと(第2章)を伝えます。