このチュートリアルで学ぶこと
- ディレクトリの移動と確認
- ファイルとディレクトリの操作
- ファイルの内容表示
- 基本的なファイル検索
LinuxとUNIXの歴史
なぜLinuxを学ぶのか
Linuxは世界のサーバーの**約96%**で稼働し、スマートフォン(Android)、スーパーコンピュータ、IoTデバイスまで、あらゆる場所で使われています。エンジニアにとって、Linuxのコマンドライン操作は必須スキルです。
UNIXの誕生
現在のLinuxコマンドのルーツは1969年に遡ります。ベル研究所のKen ThompsonとDennis RitchieによってUNIXが開発されました。
「UNIXは、プログラマがプログラマのために作ったOSである」— Brian Kernighan
Linuxの誕生
1991年、フィンランドの大学生Linus Torvaldsが、UNIXに互換性のある無料のOSカーネルを開発しました。彼の有名な投稿:
「こんにちは、minixを使っているみなさん。私は386(486)AT互換機用の(フリーな)OSを作っています」— Linus Torvalds, 1991
UNIX哲学
UNIXの設計思想は現代のソフトウェア開発にも大きな影響を与えています:
- 小さなプログラムを組み合わせる: 一つのことをうまくやるプログラムを作り、それらを組み合わせる
- テキストストリーム: プログラム間の通信にはテキストを使う
- 早期のプロトタイピング: まず動くものを作り、改善していく
「これがUNIXの哲学だ。一つのことをうまくやるプログラムを書け」— Doug McIlroy
ターミナルとシェル
ターミナルとは
ターミナル(端末エミュレータ)は、コマンドラインインターフェースを提供するアプリケーションです。
- macOS: Terminal.app、iTerm2
- Windows: Windows Terminal、PowerShell
- Linux: GNOME Terminal、Konsole
シェルとは
シェルは、ユーザーのコマンドを解釈してOSに伝えるプログラムです。
| シェル | 説明 |
|---|---|
| bash | 最も一般的。Linux/macOSのデフォルト(旧macOS) |
| zsh | macOS Catalina以降のデフォルト。bash互換 |
| fish | ユーザーフレンドリーな機能が豊富 |
| sh | POSIX標準シェル。移植性が高い |
# 現在使っているシェルを確認
echo $SHELL
ディレクトリ操作の基本
pwd - 現在地を確認
pwd(Print Working Directory)で、今いるディレクトリを確認できます。
$ pwd
/home/username
豆知識: UNIXでは、ディレクトリも「ファイル」として扱われます。ディレクトリは「ファイルへのリンクを含む特殊なファイル」です。
ls - ファイル一覧を表示
lsでディレクトリ内のファイルを一覧表示します。
# 基本的な一覧表示
$ ls
# 詳細表示(パーミッション、サイズなど)
$ ls -l
# 隠しファイルも表示
$ ls -a
# 詳細 + 隠しファイル
$ ls -la
# 人間が読みやすいサイズ表示
$ ls -lh
ls -lの出力を読む
-rw-r--r-- 1 user group 4096 Jan 1 12:00 file.txt
| 部分 | 意味 |
|---|---|
- | ファイルタイプ(-:通常, d:ディレクトリ, l:リンク) |
rw-r--r-- | パーミッション(owner/group/others) |
1 | ハードリンク数 |
user | 所有者 |
group | 所有グループ |
4096 | ファイルサイズ |
Jan 1 12:00 | 更新日時 |
公式ドキュメント: GNU Coreutils - ls
cd - ディレクトリを移動
# 指定ディレクトリに移動
$ cd /var/log
# ホームディレクトリに戻る
$ cd ~
$ cd
# 一つ上のディレクトリに移動
$ cd ..
# 直前のディレクトリに戻る
$ cd -
パスの種類
| 種類 | 説明 | 例 |
|---|---|---|
| 絶対パス | ルート(/)から始まる完全なパス | /home/user/docs |
| 相対パス | 現在地からの相対的なパス | ./docs または ../other |
特殊なディレクトリ表記:
.- 現在のディレクトリ..- 親ディレクトリ~- ホームディレクトリ/- ルートディレクトリ
ファイル・ディレクトリの作成と削除
mkdir - ディレクトリ作成
# ディレクトリを作成
$ mkdir myproject
# 深い階層を一度に作成(-p: parents)
$ mkdir -p myproject/src/components
# 作成と同時にパーミッションを設定
$ mkdir -m 755 secure_dir
ベストプラクティス: 複数階層を作成するときは必ず
-pオプションを使う。存在するディレクトリに対してもエラーにならない。
touch - ファイル作成
touchは本来「ファイルのタイムスタンプを更新する」コマンドですが、ファイルが存在しない場合は空のファイルを作成します。
# 空のファイルを作成
$ touch index.html
# 複数ファイルを一度に作成
$ touch style.css script.js
# タイムスタンプを特定の日時に設定
$ touch -t 202501011200 file.txt
公式ドキュメント: GNU Coreutils - touch
rm - ファイル・ディレクトリ削除
# ファイルを削除
$ rm file.txt
# ディレクトリを削除(中身も含めて)
$ rm -r mydir
# 確認なしで削除(注意!)
$ rm -rf mydir
# 削除前に確認を表示
$ rm -i file.txt
警告:
rm -rfは確認なしで即座に削除されます。ゴミ箱には入りません。特に/近くでの使用や変数展開(rm -rf $DIR/)には細心の注意を払いましょう。
安全な削除のためのベストプラクティス
# 1. まずlsで確認
ls /path/to/delete
# 2. -iオプションで確認しながら削除
rm -ri /path/to/delete
# 3. エイリアスを設定(~/.bashrcに追加)
alias rm='rm -i'
ファイルのコピーと移動
cp - コピー
# ファイルをコピー
$ cp original.txt copy.txt
# ディレクトリをコピー(-r: recursive)
$ cp -r mydir mydir_backup
# 複数ファイルをディレクトリにコピー
$ cp file1.txt file2.txt destination/
# タイムスタンプとパーミッションを保持
$ cp -p original.txt copy.txt
# 上書き確認
$ cp -i source.txt dest.txt
公式ドキュメント: GNU Coreutils - cp
mv - 移動・リネーム
mvはファイルの移動とリネームの両方に使います。
# ファイルを移動
$ mv file.txt /path/to/destination/
# ファイル名を変更
$ mv oldname.txt newname.txt
# ディレクトリを移動
$ mv mydir /path/to/destination/
# 上書き確認
$ mv -i source.txt dest.txt
ファイル内容の表示
| コマンド | 説明 | 使用例 |
|---|---|---|
cat | ファイル全体を表示 | cat file.txt |
head | 先頭N行を表示(デフォルト10行) | head -n 20 file.txt |
tail | 末尾N行を表示 | tail -f log.txt |
less | ページャーで表示(スクロール可能) | less file.txt |
more | 古いページャー | more file.txt |
catの応用
# 行番号を表示
$ cat -n file.txt
# 複数ファイルを結合
$ cat file1.txt file2.txt > combined.txt
# 空行を圧縮
$ cat -s file.txt
lessの操作
lessはファイルを対話的に閲覧できます:
Space/f- 1ページ進むb- 1ページ戻る/pattern- 前方検索?pattern- 後方検索n- 次の検索結果N- 前の検索結果g- ファイル先頭へG- ファイル末尾へq- 終了
豆知識:
lessという名前は「less is more」(より少ないほうがより多い)から。moreコマンドの改良版です。
tail -f でログ監視
# リアルタイムでログを監視
$ tail -f /var/log/syslog
# 複数ファイルを同時に監視
$ tail -f file1.log file2.log
# 最新の100行から監視開始
$ tail -n 100 -f app.log
パーミッション(権限)の基本
パーミッションの読み方
-rwxr-xr--
| 部分 | 意味 |
|---|---|
- | ファイルタイプ |
rwx | owner(所有者): すべて許可 |
r-x | group(グループ): 読み取り+実行 |
r-- | others(その他): 読み取りのみ |
| 記号 | 数値 | 意味 |
|---|---|---|
| r | 4 | 読み取り(read) |
| w | 2 | 書き込み(write) |
| x | 1 | 実行(execute) |
| - | 0 | 権限なし |
chmod - パーミッション変更
# 数値で指定(755 = rwxr-xr-x)
$ chmod 755 script.sh
# 記号で指定
$ chmod u+x script.sh # 所有者に実行権限を追加
$ chmod g-w file.txt # グループから書き込み権限を削除
$ chmod o=r file.txt # その他に読み取り権限のみ設定
$ chmod a+r file.txt # 全員に読み取り権限を追加
公式ドキュメント: GNU Coreutils - chmod
よく使うパーミッション
| パーミッション | 用途 |
|---|---|
| 755 | 実行可能スクリプト |
| 644 | 通常のファイル |
| 600 | 機密ファイル(SSHキーなど) |
| 700 | プライベートディレクトリ |
実践: プロジェクト構造を作成
学んだコマンドを使って、Webプロジェクトの基本構造を作成してみましょう。
# プロジェクトディレクトリを作成
mkdir -p mywebsite/{css,js,images}
# 基本ファイルを作成
touch mywebsite/index.html
touch mywebsite/css/style.css
touch mywebsite/js/main.js
# 構造を確認
ls -R mywebsite
# treeコマンドがあればより見やすく表示
tree mywebsite
実践的なプロジェクトセットアップ
# Node.jsプロジェクトの作成例
mkdir -p my-app/{src/{components,utils,styles},tests,docs}
touch my-app/{package.json,README.md,.gitignore}
touch my-app/src/index.js
# 構造確認
tree my-app
# my-app
# ├── README.md
# ├── docs
# ├── package.json
# ├── src
# │ ├── components
# │ ├── index.js
# │ ├── styles
# │ └── utils
# └── tests
よくある間違いとトラブルシューティング
スペースを含むファイル名
# 間違い: ファイル名がスペースで分割される
$ rm my file.txt # "my" と "file.txt" を削除しようとする
# 正解: クォートで囲む
$ rm "my file.txt"
$ rm 'my file.txt'
# または、バックスラッシュでエスケープ
$ rm my\ file.txt
権限エラー
# Permission denied エラーの場合
$ sudo command # 管理者権限で実行
# ファイルの権限を確認
$ ls -l file.txt
# 実行権限がない場合
$ chmod +x script.sh
ファイルが見つからない
# ファイルを検索
$ find /path -name "filename"
# 部分一致で検索
$ find . -name "*.txt"
# locateコマンド(データベースを使用、高速)
$ locate filename
便利なショートカットとコツ
ターミナルショートカット
| ショートカット | 説明 |
|---|---|
Tab | コマンドやパスの自動補完 |
Ctrl + C | 実行中のコマンドを中断 |
Ctrl + L | 画面をクリア(clearと同じ) |
Ctrl + A | 行頭へ移動 |
Ctrl + E | 行末へ移動 |
Ctrl + U | カーソル左側を削除 |
Ctrl + K | カーソル右側を削除 |
Ctrl + R | コマンド履歴を検索 |
↑ / ↓ | コマンド履歴を表示 |
!! | 直前のコマンドを再実行 |
コマンドの組み合わせ
# パイプ(|): コマンドの出力を次のコマンドの入力に
$ ls -la | grep ".txt"
# リダイレクト(>): 出力をファイルに保存
$ ls > filelist.txt
# 追記(>>): ファイルに追記
$ echo "new line" >> file.txt
# コマンドの連結
$ mkdir newdir && cd newdir # 成功時のみ次を実行
$ command1 || command2 # 失敗時に次を実行
$ command1 ; command2 # 順番に実行
次のステップ
基本コマンドをマスターしたら、次はシェルスクリプトを学んで作業を自動化しましょう。
- シェルスクリプト入門 → シェルスクリプト入門
- 正規表現を学ぶ → grep, sed, awkの使い方
参考リンク
公式ドキュメント
- GNU Coreutils Manual - 基本コマンドの公式リファレンス
- The Linux Documentation Project - Linux全般のドキュメント
- Linux man pages - manページのオンライン版
推奨書籍・記事
- The Linux Command Line(英語/無料) - コマンドライン入門の名著
- Explainshell - コマンドを入力すると解説してくれるサイト
チートシート・ツール
- Linux Command Cheat Sheet - よく使うコマンド一覧
- tldr pages - manページの簡潔版。
tldr lsのように使う - cheat.sh -
curl cheat.sh/lsでチートシートを表示