Linuxパーフェクトブック~超入門~

## はじめに
プログラミング学習を始めると、「PC初心者にはWindowsよりMacがおすすめ」といった情報をよく目にします。
でも正直、僕はその理由にあまり納得感がありませんでした。

調べてみると「開発環境の構築がラク」とか「学習コストが低い」といった説明が出てきますが、どれも抽象的でピンとこない…。
そんな中、Macで何気なく使っていた ls や touch といったコマンドが、Windowsのコマンドプロンプトでは使えないと知り、ようやく違和感の正体に気づきました。
「もしかして、Macが推される理由はこの“コマンド”にあるのでは？」と思い、Linuxの学習を始めました。

今回の記事には、当時の自分が「最初にこれを知っていれば…！」と思った知識をたくさん詰め込みました。
最後まで読んでいただければ、「Linuxってこういうものなんだな」という全体像がつかめると思います。

ぜひ、読んでみてください！
## 歴史

- OSの一種で、コンピュータを動かすための基本ソフト
    - 主なOS
        - Windows
        - Mac OS X
        - Linux
        - Android
- Unixという小さなOSが誕生する
    - 始めは使うためにお金がかかっていた
    - 1985年
        - オープンソースと言う考えで開発されるようになる。
        - ソースコードが公開されていたため派生形のUNIXが誕生
        - しかし、ライセンス縛りが厳しい状態
    - 1991年
        - 大学生のリーナス・トーバルズUNIXをマネて１からOSを開発した（Linux）
        - **有料だった、UNIXがLinuxという形で無料使用可能になった。**

## Linuxの特徴

メリット

- オープンソースなのでだれでも使える
- 世界的に使われているため信頼性が高い
- 品質の高いソフトウェアが利用可
- **自動化する仕組みがあり、サーバーの運用が行いやすい**

デメリット

- 商用アプリケーションがあまり存在しない
    - MicrosoftOfficeが動作しない
    - 画像、音楽、動画などのマルチメディア系ファイルを編集するのが苦手
- 日本語対応されていなことが多い、基本的にドキュメントが英語

## Linuxを学ぶ意味？？

幅広い場所で使われている

- サーバー用
- 組み込み起用

web業界ではサーバーはほとんどがLinuxで構築されている

長年使える

- 技術が枯れている（長年ユーザに検証されているため大きく変更する必要が無い）
    - 一度習得すれば何年経っても使える

## Linuxリストリビューション・カーネル

カーネル：

- OSの中核となるソフトウェア（カーネル単体では使いにくい）

リストリビューション：

- カーネルのいろいろなソフトウェアを組み合わせて使いやすくしたもの
- 1000種類以上ある

**一般的にLinuxとは、リストリビューションを指している**

リストリビューションの種類

- Red Hat系
    - Red Had Enterprise Linux
    - CentOS
    - Fedora
- Debian系
    - Dibian GNU/Linux
    - Ubuntu

## シェルってなに？

シェル：

- LinuxのCLIを提供するソフトウェア
- ユーザとLinuxカーネルの仲介役（カーネルのインターフェース）
![Linuxとシェルとユーザの関係.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655332/b28fa961-6308-4ee2-beda-b0fb5b28943c.png)


### シェルの構造

```bash
//[ユーザ名@ホスト名] プロンプト
[keita@localhost ~] $
```

ユーザー名：
コンピュータにログインしているユーザーの名前

ホスト名：
コンピュータ等の機器を人間が識別しやすいようにつけた名前（コンピュータ名前・IPアドレス）

プロンプト：
ユーザーからのコマンド入力を待っている（待機状態）ユーザーはコマンドを入力できる状態

### シェルの仕組み

1. ユーザーがプロンプトにコマンドを打つ
2. シェルが入力された名前のコマンドを探す
3. Linuxカーネルが見つかったコマンドを実行する
4. シェルが実行結果を画面に表示する

例：

```bash
$ date
//画面の出力
2025年　6月 20日 金曜日　10:00:24　UTC
```

Linuxを操作する時はターミナルにコマンドを入力する

- ターミナルは入出力画面を提供するソフトウェア。
- シェルはコマンドを解釈するソフトウェア。

**ターミナルとシェルは別物。注意！！**

シェルの種類

- sh
    - 最も古いシェル
    - 標準的なシェル
    - 機能は少ない
- bash
    - shを基本として機能を拡張したシェル
    - Linux環境でデフォルトのログインシェル
- zsh
    - bashを更に使いやすくし、独自の拡張も追加したシェル
    - 機能の豊富なシェル
    - M2のMacのターミナルのデフォルトのシェル

## 環境構築（仮想マシンの構築）

### インストール手順

結論：**Mac OS（M1,M2,M3,M4）を使用している場合はこの手順なくして、既存のターミナルを使ってLinuxのコマンドを使用することができます**

**初心者はMacで学習すること強くおすすめします**

ここではMac OS（M1,M2,M3,M4）についての方法を記載します（僕のようにどーしても仮想環境を構築したいという方向け）
この手順は飛ばしていただいて構わない

1. UTMをインストール
    - UTMというアプリをダウンロードする
    
    https://mac.getutm.app/
    
2. CentOS系AMR（M1,M2,M3,M4）対応のイメージファイルをダウンロード
    
    
    | ディストリビューション | ダウンロードリンク |
    | --- | --- |
    | **AlmaLinux 9 ARM版** | [https://almalinux.org](https://almalinux.org/) |
    | **Rocky Linux 9 ARM版** | [https://rockylinux.org](https://rockylinux.org/) |
    | CentOS Stream 9 ARM版（テスト向け） | https://www.centos.org/centos-stream/ |
    
    > 例: AlmaLinux → 「Download」→ 「aarch64 (ARM64)」→ DVD ISO を選択
    > 
3. UTMで新規仮想マシンを作成
    1. **UTMを起動**
    2. 左下の「＋」をクリック → 「仮想化」を選択（Apple Siliconなら `Virtualize` 推奨
    3. OSの種類で「Linux」を選択
4. ISOファイルを選択してインストール準備
    1. 「起動ISOイメージ」でさきほどダウンロードした `.iso` ファイルを指定
    2. メモリ（例: 2048 MB）、CPUコア数（例: 4）を設定
    3. ストレージ（例: 20〜40GB）を追加
    4. OpenGLアクセラレーションについて(有効/無効どちらでも)
        - **OpenGL（Open Graphics Library）** は、3Dや2Dの描画に使われる**グラフィックAPI**のひとつです。**アクセラレーション**とは、「ソフトウェアではなくハードウェア（GPU）に処理を任せて高速化する」ことを意味する
            
            > つまり：**仮想マシンの画面描画（GUIやグラフィック）を速く・滑らかにしたいなら有効にするオプション**
            > 
    5. 共有ディレクトリは特に必要なし
    6. 最後に任意で名前を決めて完了（デフォルトのままでもOK）
5. インストールとセットアップ
    1. UTMを開いて、作成した仮想マシンを▶️で起動する
    2. Install AlmaLinux 10.0を選ぶreturnキーを押す
    3. GUIが開くので任意で設定する
        - インストール先は変更無し
        - rootアカウント（R）を設定する
        - 言語（任意）
        - 時刻と日付（T）（任意）
        - インストール開始
6. LinuxOSGUI起動
     1. UTMを再起動する
        1. CD/DVDの項目を削除し空にする
        2. 再起動する
        3. フルネーム、（ユーザー名）を入力し次へ
        4. 任意のパスワードを設定してログイン
        5. ログイン完了

**おめでとうございます！！**
**LinuxOS仮想マシンでを立ち上げることができました！！**

上記にも書きましたが、Mac(M1,M2,M3,M4)をお使いの方は**ターミナルアプリを使えば仮想マシンの環境構築不要**

## シェルのショートカットキー

> **注意：**
mac では通常の mac アプリと違って、**ターミナルでは `Command（⌘）` ではなく `Control（^）` キー**を使うつまり、ここでの**mac の Control キー**を指します。
> 

カーソルの移動

| キー操作 | 動作（意味） |
| --- | --- |
| `Ctrl + F` | 1文字次へ移動 |
| `Ctrl + B` | 1文字前へ移動 |
| `Ctrl + A` | 行の先頭へ移動 |
| `Ctrl + E` | 行の末尾へ移動 |
| `esc + F` | 1単語次へ移動 |
| `esc + B`  | 1単語前へ移動 |

文字列の編集

| `Ctrl + H`  | カーソルの左を1文字削除 |
| --- | --- |
| `Ctrl + D`  | カーソルの部分を1文字削除 |
| `Ctrl + W` | カーソルより前の単語を削除（カーソルの位置） |
| `Ctrl + U` | カーソルより前を削除（行頭まで） |
| `Ctrl + K` | カーソルより後を削除（行末まで） |
| `Ctrl + Y` | 最後に削除した内容を貼り付け（ヤンク） |

トラブル時の対応

| `Ctrl + L` | 画面をクリア。文字化けした時も使える（`clear` コマンドと同じ） |
| --- | --- |
| `Ctrl + C` | コマンドの実行を強制終了 |
| `Ctrl + S`  | 画面ロック（キーボードから入力受け付けない） |
| `Ctrl + Q`  | 画面ロック解除 |

補完

| キー操作 | 動作（意味） |
| --- | --- |
| `Tab` | コマンドやファイル名の補完（2回押すと候補表示） |
| `↑ / ↓` | コマンド履歴を上下にたどる |
| `!!` | 直前のコマンドを再実行 |
| `!abc` | `abc` で始まる直近のコマンドを再実行 |
| `Ctrl + R` | コマンド履歴のインクリメンタル検索（超便利） |

Ctrl + R実行時のショートカットキー

| キー操作 | 動作（意味） |
| --- | --- |
| 文字の入力 | コマンド履歴から検索 |
| `Ctrl + R`  | 1つ前の検索結果へ移動 |
| Enter（return） | 現在の検索結果へ移動 |
| esc | 現在の検索結果を表示したままコマンドラインに戻る |
| `Ctrl + g`  | 検索結果を破棄し、コマンドラインに戻る |

## Linuxディレクトリ

ディレクトリ：

ファイルが保存されている場所

### ディレクトリ構造

- ルートディレクトリ（ / ）を頂点とした階層構造になっている。「ディレクトリツリー」と呼ぶ
- WindowsOSは複数ドライブから入れ子構造が始まる。（Dドライブ、Cドライブ等）Linuxは一つのディレクトリ（ルートディレクトリ）から始まる
- ディレクトリ事に役割がある

主なファイルと役割

| ディレクトリ | 内容（何が入っているか） |
| --- | --- |
| `/` | ルートディレクトリ。全てのディレクトリの最上位 |
| `/bin` | 基本的なコマンド（`ls`, `cp`, `mv`, `rm` など）が格納されている実行ファイル |
| `/dev` | デバイスファイル（HDD, USB, マウスなど）が配置される |
| `/etc` | 設定ファイル群（`passwd`, `hosts`, `fstab` など）。システム全体の設定がここに。**重要** |
| `/home` | 一般ユーザーのホームディレクトリ（例：`/home/ユーザー名`）。ユーザーは自由にファイルやディレクトリを作成できる |
| `/lib` | 基本コマンドやカーネルが利用する共有ライブラリ。 |
| `/opt` | サードパーティ製ソフトウェアのインストール先。 |
| `/root` | rootユーザー専用のホームディレクトリ。 |
| `/sbin` | 管理者用のシステムコマンド（`fsck`, `reboot`, `ifconfig` など） |
| `/tmp` | 一時ファイルの保存場所。再起動で削除されることが多い |
| `/usr` | ユーザー向けアプリケーションやライブラリ |
| `/usr/bin` | 一般ユーザー向けの実行ファイル。 |
| `/usr/sbin` | 管理者向けのシステムコマンド。 |
| `/usr/lib` | `/usr/bin`のプログラムが使用するライブラリ。 |
| `/var` | 可変データ（ログ、スプール、キャッシュなど）。 |
| `/var/log` | 各種ログファイル（`syslog`, `auth.log` など）。 |

## 主なLinuxのコマンド

### cd
    
```bash
cd [ディレクトリ]
```
    
用途:ディレクトリの移動    
具体例:
    
```bash
$cd /home/yoshida/documents
```
    
特殊なディレクトリの指定:
    
| ディレクトリ | 意味（どこを指すか） | 指定例（コマンド） |
| --- | --- | --- |
| `~` | 自分のホームディレクトリ | `cd ~` |
| `.` | 現在のディレクトリ（カレントディレクトリ） | `cd .` |
| `..` | 親ディレクトリ（1階層上） | `cd ..` |
| `../..` | 2階層上の親ディレクトリ | `cd ../..` |
| `-` | 直前にいたディレクトリ | `cd -` |
| `/` | ファイルシステムのルートディレクトリ | `cd /` |
    
### pwd
    
```bash
pwd
```
    
用途: カレントディレクトリを表示するコマンド
    
具体例:
    
```bash
$ pwd /home/machida
```
    
**現在どこのディレクトリで作業しているかを確認しながら作業する**
    
### ls
    
```bash
ls [オプション][ディレクトリ・ファイル名]
```
    
用途: ディレクトリの中身を確認する
    
具体例:
    
```bash
$ ls /
bin dev etc sbin ...
    
#複数のディレクトリを指定することも可能
$ ls / /home
/:
bin dev etc sbin ...
/home:
hoge hoge.text
 ```
    
パス名展開:
    
| 記号 | 意味 |
| --- | --- |
| `*` | 0文字以上の任意の文字列にマッチ |
| `?` | 任意の1文字にマッチ |
| `[abc]` | `a` または `b` または `c` の1文字にマッチ |
| `[a-z]` | `a`〜`z` の任意の1文字にマッチ（範囲指定） |
| `[!abc]` | `a`、`b`、`c` 以外の1文字にマッチ（否定） |
| `[!a-z]` | `a`〜`z` 以外の1文字にマッチ（否定の範囲指定） |
| `{a,b,c}` | `a` または `b` または `c` を展開（**ブレース展開**） |
| `~` | 自分のホームディレクトリに展開。/home/okada （ホームディレクトリ）を ~で指定可能 |
    
```bash
ls *.txt	
.txtで終わる全ファイルを表示
   
ls data??.csv
data12.csv や data13.csv など
daata112は除外される
    
ls report[1-3].md	
report1.md〜report3.mdを表示
    
ls {jan,feb}.log	
jan.logとfeb.logを表示
    
ls ~/Downloads	
/Users/keita/Downloads を表示
```
    
よく使うオプション
    
| 書き方 | 例 | 意味 |
| --- | --- | --- |
| `-a` | `ls -a` | 隠しファイルも表示 |
| `-l` | `ls -l` | 詳細表示 |
| `-F`  | `ls -F`  | ファイルの識別記号をつける |
    
`-F` で表示される記号の意味
    
| 記号 | 意味 | 例 |
| --- | --- | --- |
| `/` | ディレクトリ（フォルダ） | `Documents/` |
| `*` | 実行可能ファイル | `script.sh*` |
| `@` | シンボリックリンク（エイリアス） | `shortcut@` |
| `=` | ソケットファイル（特殊用途） | `myservice=` |
| ` | ` | 名前付きパイプ（FIFO） |
   
例: 
  
```bash
$ ls -F 
Documents/  hello.txt  run.sh*  shortcut@  mypipe|  socket=
```
    
### mkdir
    
```bash
mkdir [オプション] <作成するディレクトリ名>
```
    
用途: ディレクトリを作る
   
具体例:
    
```bash
#componentsディレクトリを作成する
$ mkdir compoments
```
    
よく使うオプション:
  
| オプション | 意味 | 使用例 | 説明例 |
| --- | --- | --- | --- |
| `-p` | **親ディレクトリもまとめて作成** | `mkdir -p a/b/c` | `a`, `b`, `c` が順に無ければ全部作成する |
| `-v` | **作成されたディレクトリを表示（verbose）** | `mkdir -v newdir` | 「mkdir: ディレクトリ 'newdir' を作成しました」と表示 |
    
例:
    
```bash
$ mkdir -pv conponents/button 
mkdir:ディレクトリ　'components/button を作成しました
```
    
### rmdir
    
```bash
rmdir <ディレクトリ名>
```
    
用途: 空のディレクトリを削除するコマンド（空でないディレクトリを消そうとするとエラーになる）
    
具体例: 
    
```bash
$ rmdir components
```
    
### cat
    
```bash
cat [オプション] <ファイル名>
```
    
用途: ファイルの中身を表示するコマンド
    
具体例:
    
```bash
$ cat /etc/fstab
#
#/etc/fstab
#Created by anaconda on Fri ....
UUID=....
```
    
よく使うオプション:
    
| オプション | 意味 | 使用例 | 説明例 |
| --- | --- | --- | --- |
| `-n` | 行番号を付けて表示 | `cat -n file.txt` | 各行の先頭に番号が表示される |
| `-b` | **空行を除いて**行番号を付ける | `cat -b file.txt` | 空行には番号を付けない |
### less
    
```bash
less [オプション] <ファイル名>
```
    
用途: ファイルの中身をスクロール表示する（長いファイルを見たい時に使う）
    
具体例:
    
```bash
$ less /etc/vimrc
```
    
スクロールの操作
    
| 操作キー | 意味・動作内容 |
| --- | --- |
| `↓` または `j` | 1 行下にスクロール |
| `↑` または `k` | 1 行上にスクロール |
| `Space`,`f` | 1 画面分下にスクロール |
| `b` | 1 画面分上にスクロール（back） |
| `d` | 半画面分下にスクロール（down） |
| `u` | 半画面分上にスクロール（up） |
| `G` | ファイルの最後行へジャンプ |
| `g` | ファイルの先頭行へジャンプ |
| 数字 + `g` | 指定した行番号へジャンプ（例：`20g`） |
| `/文字列` | 指定した文字列を**下方向に検索** |
| `?文字列` | 指定した文字列を**上方向に検索** |
| `n` | 前回の検索方向に再検索（next） |
| `N` | 前回の検索と**逆方向に再検索** |
| `h` | ヘルプ画面を表示 |
| `q` | 閲覧終了（quit） |
### tail / head
    
```bash
tail [オプション] [ファイル]
head [オプション] [ファイル]
```
    
用途:
`tail`:データの終わり部分を標準出力する（オプション`-n`を指定しない場合は10行を標準出力）
    
`head`:データの始まり部分を標準出力する（オプション`-n`を指定しない場合は10行を標準出力）
    
具体例:
    
```bash
# 末尾から10行を標準出力
$ tail output.txt
# 末尾から5行を標準出力
$ tail output.txt
    
# 初めから10行を標準出力
$ head output.txt
# 初めから5行を標準出力
$ head output.txt
```
    
よく使うオプション:
    
`tail`
    
| オプション | 意味 | 使用例 | 説明例 |
| --- | --- | --- | --- |
| `-n` | 表示する行数を指定 | `tail -n 10 file.txt` | ファイルの末尾から10行表示（デフォルト） |
| `-c` | 表示するバイト数を指定 | `tail -c 50 file.txt` | ファイルの末尾から50バイト分だけ表示する |
| `-f` | 追記をリアルタイム表示 | `tail -f /var/log/syslog` | ログファイルなどの追記をリアルタイムで監視表示する |
| `--pid=PID` | 指定PIDのプロセス終了で停止 | `tail -f file --pid=1234` | `tail -f`をプロセス終了と同時に自動終了させる |
| `-q` | ヘッダーを表示しない | `tail -q file1 file2` | 複数ファイルの出力時にファイル名ヘッダーを非表示にする |
| `-v` | 常にヘッダーを表示 | `tail -v file1` | 単一ファイルでもファイル名のヘッダーを表示する |
    
`head`
    
| オプション | 意味 | 使用例 | 説明例 |
| --- | --- | --- | --- |
| `-n` | 表示する行数を指定 | `head -n 5 file.txt` | ファイルの先頭から5行だけ表示する |
| `-c` | 表示するバイト数を指定 | `head -c 100 file.txt` | ファイルの先頭から100バイト分だけ表示する |
| `-q` | ヘッダーを表示しない | `head -q file1 file2` | 複数ファイル指定時にファイル名のヘッダー表示を抑制する |
| `-v` | 常にヘッダーを表示 | `head -v file1 file2` | 1ファイルだけでも必ずファイル名のヘッダーを表示する |
### touch
    
```bash
touch <新規ファイル名1> <新規ファイル名2> ...
```
    
用途: 空のファイルを作成するコマンド
    
具体例: 
    
```bash
$ touch index.html
```
    
よく使うオプション:
    
| オプション | 意味 | 使用例 | 説明例 |
| --- | --- | --- | --- |
| `-c` / `--no-create` | ファイルがなければ作成しない | `touch -c sample.txt` | `sample.txt` が存在する場合のみタイムスタンプを更新、新規作成しない |
| `-a` | アクセス時刻のみ更新 | `touch -a file.txt` | アクセス時刻（atime）のみ変更、修正時刻（mtime）はそのまま |
| `-m` | 修正時刻のみ更新 | `touch -m file.txt` | 修正時刻（mtime）のみ変更、アクセス時刻はそのまま |
### rm
    
```bash
rm [オプション]<削除するファイル名１><削除するファイル名２>
```
    
用途: ファイル・ディレクトリを削除するコマンド
    
注意:
    
rmコマンドを使用して削除した場合、ゴミ箱に行くのではなく本当に削除される（復活不可）
    
具体例:
    
```bash
$ rm index.html
```
    
よく使うオプション:
    
| オプション | 意味 | 使用例 | 説明例 |
| --- | --- | --- | --- |
| `-i` | 削除前に確認メッセージを表示 | `rm -i file.txt` | `file.txt` を削除する前に「削除してよいか？」と尋ねられる |
| `-f` | 確認なしで強制削除 | `rm -f file.txt` | 存在しないファイルでもエラーを出さず、存在する場合は強制的に削除 |
| `-r` または `-R` | ディレクトリと中身を再帰的に削除 | `rm -r myfolder` | `myfolder` ディレクトリとその中のすべてのファイル・フォルダを削除 |
| `-rf` | 強制的に再帰削除（確認なし） | `rm -rf myfolder` | 中身をすべて確認なしで削除。**危険な操作**のため注意が必要 |
| `-v` | 削除したファイル名を表示 | `rm -v file.txt` | 削除されたファイル名を標準出力に表示 |
### mv
    
```bash
mv [オプション]<移動元>...<移動先>
```
    
用途: ファイルの移動、ファイルの名前を変更するコマンド
    
具体例:
    
```bash
#ファイル名の変更
$ mv file1 file01
    
#ファイルを移動
$ mv file01 dir/
```
    
よく使うオプション:
    
| オプション | 意味 | 使用例 | 説明例 |
| --- | --- | --- | --- |
| `-i` | 上書き時に確認メッセージを表示 | `mv -i old.txt new.txt` | `new.txt` が存在する場合、上書きする前に「上書きしてよいか？」と確認される |
| `-f` | 上書き確認なしで強制的に移動 | `mv -f old.txt new.txt` | `new.txt` があっても確認せずに上書きして移動する |
| `-n` | 既存ファイルがあれば上書きしない | `mv -n old.txt new.txt` | `new.txt` がすでに存在する場合、何もせずスキップする |
| `-v` | 処理内容を表示（verbose） | `mv -v old.txt new.txt` | `old.txt` -> `new.txt` のように、何がどう移動されたかが表示される |
| `-u` | 移動先より新しい場合のみ上書き | `mv -u updated.txt backup/` | `backup/` にある同名ファイルより `updated.txt` が新しい場合だけ上書き移動する |
### cp
    
```bash
cp [オプション] <コピー元>...<コピー元>
```
    
用途: ファイル・ディレクトリをコピーするコマンド
    
注意: コピー先のファイルがすでにあると上書きしてしまう
    
具体例:
    
```bash
#ファイルをコピー
$ cp file file2
    
#ファイルをディレクトリにコピー
$ cp file2 src
```
    
よく使うオプション:
    
| オプション | 意味 | 使用例 | 説明例 |
| --- | --- | --- | --- |
| `-i` | 上書き時に確認メッセージを表示 | `cp -i file.txt backup.txt` | `backup.txt` が存在する場合、上書きするかどうかを確認される |
| `-f` | 強制的に上書きする（確認なし） | `cp -f file.txt backup.txt` | 存在する `backup.txt` を確認せずに上書きする |
| `-n` | 既存ファイルがあればコピーしない | `cp -n file.txt backup.txt` | `backup.txt` が存在する場合、コピーされずスキップされる |
| `-r` | ディレクトリを再帰的にコピーする | `cp -r mydir backup/` | ディレクトリ `mydir` を中身ごと `backup/` にコピーする |

### ln

```bash
ln [オプション] <リンク元リンク名> <リンク名>
```

用途: リンクを張るコマンド

注意: オプションをつけないとハードリンクになる

具体例:

```bash
#ハードリンクを張る
$ ln file1 file2
```

よく使うオプション:

| オプション | 意味 | 使用例 | 説明例 |
| --- | --- | --- | --- |
| `-s` | シンボリックリンクを作成 | `ln -s /path/to/original linkname` | 実体ファイルに対する**ショートカットのようなリンク**を作成 |
| `-f` | 強制的に上書き | `ln -sf /new/path linkname` | すでに存在するリンクを**強制的に置き換える** |
| `-n` | ディレクトリ上書き時にリンク先ではなくリンク自体を上書き | `ln -sn target link` | リンク先がディレクトリでもリンク自体を上書き |
| `-v` | 処理内容を表示（verbose） | `ln -sv target link` | 何をリンクしたかを**明示的に出力** |

> ハードリンク: 同じinode番号
シンボリックリンク: パス情報を保持する別ファイル（ショートカット的）
inode番号（アイノード番号）: LinuxやUnix系のファイルシステムでファイルやディレクトリを管理するために使われる、実体を識別する番号
> 
###  find
    
```bash
find <検索開始ディレクトリ> <検索条件> <アクション>
```
    
用途:
    
ファイルを検索するコマンド
    
具体例:
    
```bash
$ find . -name index.html -print
# .:検索開始ディレクトリ
# -name index.html: 検索条件
# -prin: 検索アクション
```
    
よく使う検索条件:
    
| オプション | 意味 | 使用例 | 説明例 |
| --- | --- | --- | --- |
| `-name` | ファイル名で検索 | `find . -name "test.txt"` | カレントディレクトリ以下から `test.txt` を名前で検索 |
| `-iname` | 大文字小文字を無視して検索 | `find . -iname "TEST.txt"` | `TEST.txt` も `test.txt` も一致 |
| `-type` | ファイル種別で検索 | `find . -type f` | 通常のファイル（f）、ディレクトリ（d）などを検索。詳細は後述 |
| `-size` | ファイルサイズで検索 | `find . -size +1M` | 1MBより大きいファイルを検索 |
| `-mtime` | 最終更新日時（日単位）で検索 | `find . -mtime -3` | 過去3日以内に更新されたファイルを検索 |
| `-atime` | 最終アクセス日時で検索 | `find . -atime +10` | 10日以上アクセスされていないファイルを検索 |
| `-newer` | 指定ファイルより新しいものを検索 | `find . -newer ref.txt` | `ref.txt` より更新日時が新しいファイルを検索 |
| `-user` | 所有者で検索 | `find /home -user keita` | ユーザー `keita` が所有するファイルを検索 |
| `-group` | グループで検索 | `find /home -group staff` | `staff` グループのファイルを検索 |
| `-perm` | パーミッションで検索 | `find . -perm 644` | パーミッションが `644` のファイルを検索 |
| `-empty` | 空ファイルまたは空ディレクトリ | `find . -empty` | 空のファイルやディレクトリを検索 |
| `-maxdepth` | 探索の最大階層を制限 | `find . -maxdepth 1 -name "*.sh"` | カレントディレクトリ直下のみを対象に `.sh` ファイルを検索 |
| `-mindepth` | 探索の最小階層を指定 | `find . -mindepth 2 -name "*.log"` | 2階層目以降から `.log` ファイルを検索 |
    
    `-type` で指定できる主なファイルタイプ
    
| 指定 | 意味 | 具体例 | 説明 |
| --- | --- | --- | --- |
| `f` | 通常ファイル | `find . -type f` | 通常のファイル（テキストや画像など）を検索 |
| `d` | ディレクトリ | `find . -type d` | ディレクトリ（フォルダ）を検索 |
| `l` | シンボリックリンク | `find . -type l` | シンボリックリンク（ショートカット）を検索 |
| `c` | キャラクタ型デバイスファイル | `find /dev -type c` | `/dev` 直下のキーボードやマウスなどのデバイス |
| `b` | ブロック型デバイスファイル | `find /dev -type b` | ハードディスクやUSBなどのブロックデバイス |
| `p` | 名前付きパイプ（FIFO） | `find . -type p` | 通信に使う特殊なファイル（mkfifo で作成） |
| `s` | ソケットファイル | `find . -type s` | プロセス間通信用のソケットファイル |
    
複数条件組み合わせオプション:
    
| 演算子 | 意味 | 使用例 | 説明 |
| --- | --- | --- | --- |
| `-a` | AND（かつ） | `find . -type f -a -name "*.txt"` | 通常ファイルかつ `.txt` という名前 |
| `-o` | OR（または） | `find . -name "*.txt" -o -name "*.md"` | `.txt` か `.md` ファイル |
| `()` | 条件のグループ化（優先順位） | `find . \( -name "*.txt" -o -name "*.md" \) -a -type f` | `.txt` または `.md` の通常ファイル |
- `a` は省略可能（`find . -type f -name "*.txt"` は AND の意味になる）
- `()` を使うと、複雑な条件を整理してグループ化できる（※ バックスラッシュでエスケープが必要：`\(` `\)`）
### chmod
    
```bash
# 記号方式（シンボリックモード）
chmod [ugoa] [+-=] [rwx] <ファイル名>
    
# 数値（オクタルモード）
chmod <8進数の数値> <ファイル名>
    
```
    
用途: ファイルやディレクトリの[パーミッション](#パーミッション)を設定する
    
具体例:
    
記号方式（シンボリックモード）
    
```bash
#　記号方式（シンボリックモード）
$ chmod u+r file
# fileの所有者(u)に書き込む(r)を追加(＋)する
```
    
`chmod` 記号方式（シンボリックモード）
    
| 記号 | 意味 | 例 | 説明例 |
| --- | --- | --- | --- |
| `u` | 所有者（user） | `chmod u+x file` | 所有者に実行権限を追加する |
| `g` | グループ（group） | `chmod g-w file` | グループの書き込み権限を削除する |
| `o` | その他（others） | `chmod o+r file` | その他に読み取り権限を追加する |
| `a` | 全員（all = u+g+o） | `chmod a-x file` | 全ユーザーから実行権限を削除する |
    
操作記号
    
| 記号 | 意味 | 使用例 | 説明 |
| --- | --- | --- | --- |
| `+` | 権限を追加 | `chmod u+x file` | 所有者に実行権限を追加 |
| `-` | 権限を削除 | `chmod g-w file` | グループの書き込み権限を削除 |
| `=` | 権限を指定 | `chmod o=r file` | その他を「読み取り専用」に設定 |
    
数値（オクタルモード）
    
```bash
# 数値（オクタルモード）
$ chmod 755 file
# fileの所有者（１桁目(7)）には読み取り(r(4))・書き込み(w(2))・実行(x(1))を許可する(7=4+2+1)
# fileのグループ(2桁目(5))には読み取り(r(4))・実行（x(1)）を許可する（5=4+1）
# 所有者・グループ以外の一般ユーザー（３桁目(5)）グループ同様の権限を与える
```
    
ユーザーの種別（左から順）:
    
| 対象 | 意味 |
| --- | --- |
| 1桁目 | 所有者（user） |
| 2桁目 | グループ（group） |
| 3桁目 | その他（others） |
    
パーミッション表:
    
| 数値 | 記号（rwx） | 意味 | 使用例（`chmod`） |
| --- | --- | --- | --- |
| 0 | --- | 何も許可しない | `chmod 000 ファイル名` |
| 1 | --x | 実行のみ許可 | `chmod 111 ファイル名` |
| 2 | -w- | 書き込みのみ許可 | `chmod 222 ファイル名` |
| 3 | -wx | 書き込み + 実行許可 | `chmod 311 ファイル名` |
| 4 | r-- | 読み取りのみ許可 | `chmod 444 ファイル名` |
| 5 | r-x | 読み取り + 実行許可 | `chmod 555 ファイル名` |
| 6 | rw- | 読み取り + 書き込み許可 | `chmod 644 ファイル名`（よく使う） |
| 7 | rwx | 読み取り + 書き込み + 実行すべて許可 | `chmod 755 ファイル名`（よく使う） |
    
よく使うパーミッション：
    
```bash
$ chmod 644 ファイル名
# 所有者は読み取り・書き込み、グループとその他のユーザーは読み取りのみを許可する
    
$ chmod 755 ファイル名
# 所有者は読み取り・書き込み・実行、グループとその他のユーザーは読み取り・書き込みのみ許可する
```
    
### chown
    
```bash
chown [オプション] [ユーザー] [:[グループ]] ファイル
```
    
用途: 所有者やグループを変更するコマンド
    
具体例:
    
```bash
# 所有者の変更
$ sudo chown sato test.txt
# 所有者と所有グループを変更
$ sudo chown sato:Dev test.txt
# 所有グループを変更
$ sudo chown :Dev test.txt
```
    
注意:
    
作成したファイルの所有者または所有グループを変更するときには管理者権限（`sudo`をつけて）でコマンドを実行する必要がある
    
よく使うオプション:
    
| オプション | 意味 | 使用例 | 説明例 |
| --- | --- | --- | --- |
| `-R` | 再帰的に変更 | `chown -R user:group /var/www` | `/var/www`以下のすべてのファイルとフォルダの所有者を再帰的に変更 |
| `--from` | 指定の所有者/グループのものだけ変更 | `chown --from=olduser newuser file.txt` | 所有者が `olduser` のファイルに対してのみ、`newuser` に変更する |
| `-c` | 変更があったファイルを表示 | `chown -c user file.txt` | 所有者が変わったファイルだけ表示される |
| `-v` | すべての処理を表示 | `chown -v user file.txt` | 所有者変更の処理内容を詳細に表示（変更がなくても出力） |
| `--no-dereference` | シンボリックリンク自体に適用 | `chown --no-dereference user link` | リンク先ではなく、**リンクファイルそのもの**の所有者を変更する |
| `--reference` | 参照ファイルと同じ所有者に設定 | `chown --reference=ref.txt target.txt` | `ref.txt`と同じ所有者・グループに`target.txt`を設定 |


### ps
    
```bash
ps [オプション]
```
    

用途: 実行中のプロセスを表示するコマンド

具体例:

```bash
$ ps
  PID  TTY    TIME     CMD
  3418 pts/0  00:00:00 bash
  8863 pts/0  00:00:00 ps
# 一行ずつが一つのプロセス
# PIDにプロセスID
# CMDに実行中のコマンド
```

よく使うオプション:

| オプション | 意味 | 使用例 | 説明例 |
| --- | --- | --- | --- |
| `a` | 他ユーザーのプロセスも表示 | `ps a` | 自分以外のログインユーザーの端末付きプロセスも表示される |
| `u` | ユーザー情報付き表示 | `ps u` | 実行ユーザーやCPU使用率、メモリ使用率などが表示される |
| `x` | 端末なしプロセス表示 | `ps x` | デーモンなど端末に紐づかないバックグラウンドプロセスも表示 |
| `aux` | 全プロセス詳細表示 | `ps aux` | すべてのプロセスを詳細に表示。日常的によく使われる形式 |
| `e` | 環境変数も表示 | `ps e` | 実行中プロセスが保持している環境変数が表示される |
| `f` | ツリー構造表示 | `ps f` | プロセスの親子関係がわかるツリー形式で表示 |
| `l` | ロング形式表示 | `ps l` | PIDやPPID、優先度（PRI）など詳細なシステム情報を表示 |
| `w` | 幅広表示 | `ps w` | コマンド名や引数が長いとき、切れずに広く表示できる |


### jobs

```bash
jobs
```

用途: 現在のジョブの一覧を表示するコマンド

具体例:

```bash
$ jobs
[1]+ 　　　実行中　　　sleep20 &
# ジョブID　実行状況　実行コマンド
```

> $ <コマンド> &:
コマンドの後ろに半角スペース+＆を追加することでバックグラウンドでコマンドを実行することが可能
コマンド実行中にCtrl + zでコマンドを停止状態にすることができる
> 
### fg
    
```bash
fg %<ジョブID>
```
    
用途: ジョブをフォアグラウンドにするコマンド
    
具体例:
    
```bash
$ fg %2
# ジョブ（上記例ではジョブID = 2）を対話的に操作したい場合に使う
```
    
### bg
    
```bash
bg %<ジョブID>
```
    
用途: ジョブをバックグラウンドにするコマンド
    
具体例:
    
```bash
$ bg %1
# ジョブをバックグラウンドで実行する（コマンドの実行を待たずにコマンドを実行できる）
```
    
### kill
    
```bash
kill [オプション] %<ジョブID>
kill [オプション] <プロセスID>
```
    
用途: ジョブやプロセスを終了させるコマンド（正確には**シグナルを送信するコマンド**）
    
具体例:
    
```bash
$ kill %2
$ kill 3418
# デフォルトでは -SIGTERM 3418のように「SIGTERM」というシグナルを送信している
```
    
シグナル種類:
    
| シグナル名 | 番号 | 意味 | 使用例 | 説明 |
| --- | --- | --- | --- | --- |
| `SIGTERM` | 15 | 通常終了要求 | `kill 1234` | プロセスに終了を依頼する標準的なシグナル。通常はこのシグナルが使われる |
| `SIGKILL` | 9 | 強制終了 | `kill -9 1234` | プロセスを強制終了（拒否不可）。リソース解放が行われない可能性がある |
| `SIGINT` | 2 | 割り込み | `kill -2 1234` | Ctrl+C に相当。ユーザーによる中断指示 |
| `SIGHUP` | 1 | ハングアップ | `kill -1 1234` | 設定ファイルの再読み込みなどに使われる（デーモン再起動など） |
| `SIGQUIT` | 3 | 強制終了＋ダンプ | `kill -3 1234` | Ctrl+\ に相当。コアダンプを生成して終了 |
| `SIGSTOP` | 19 | 一時停止 | `kill -19 1234` | プロセスを一時停止（再開不可） |
| `SIGCONT` | 18 | 再開 | `kill -18 1234` | 停止中のプロセスを再開 |
| `SIGUSR1` | 10 | ユーザー定義1 | `kill -10 1234` | ユーザーが自由に使えるシグナル。アプリ固有の制御に使われることも |
| `SIGUSR2` | 12 | ユーザー定義2 | `kill -12 1234` | `SIGUSR1`と同様、用途自由なユーザー定義用のシグナル |
| `SIGALRM` | 14 | タイマー通知 | `kill -14 1234` | タイマーの通知に使われる。`alarm()` システムコールと連動 |

## リダイレクト【>】

```bash
コマンド > ファイル名
```

- 標準出力（stdout）をファイルに書き出す（上書き）
- つまり、**画面に表示する代わりに、ファイルに保存する**

> 標準入力（stdin）:キーボードなどから**データを受け取る**通り道
> 
> 
> 例：`cat` 実行後に文字を打つと、入力が標準入力から渡される
> 
> 標準出力（stdout）
> 
> → 処理結果を**表示するための出力先。**通常は**画面（ターミナル）**に出る
> 
> 例：`echo "hello"` の出力は標準出力
> 
> 標準エラー出力（stderr）
> 
> → エラー内容を**表示するための出力先**。これも画面に出るが、標準出力とは**別ルート**
> 
> 例：`ls nofile` のエラーメッセージは標準エラー出力。
> 

| コマンド例 | 意味・説明 |
| --- | --- |
| `echo "Hello" > message.txt` | `Hello` という文字列を `message.txt` に出力（**既存の内容は消える**） |
| `ls > list.txt` | カレントディレクトリのファイル一覧を `list.txt` に保存（画面には表示されない） |
| `date > now.txt` | 現在日時を `now.txt` に保存 |

リダイレクトの種類

| 記号 | 説明 |
| --- | --- |
| `>` | 標準出力を**上書き** |
| `>>` | 標準出力を**追記** |
| `2>` | 標準エラー出力（stderr）を上書き |
| `&>` | 標準出力とエラー出力の両方を上書き |

/dev/nullについて

| コマンド例 | 説明 |
| --- | --- |
| `command > /dev/null` | 標準出力（stdout）を捨てる（画面に表示しない） |
| `command 2> /dev/null` | 標準エラー出力（stderr）だけを捨てる |
| `command > /dev/null 2>&1` | **標準出力もエラー出力も**どちらも捨てる |

> /dev/null とは
> 
> - **ブラックホール**」のようなもの
> - 送ったデータはすべて **消える**
> - 読み込もうとしても **何も出てこない（空）**

## パイプライン

```bash
コマンド | コマンド
```

用途: コマンドを複数連携させる。コマンドの標準出力を別のコマンドの標準出力につなげる

具体例:

```bash
$ ls /bin | less
$ ls /bin | grep systemd | less
```

> `grep`コマンド:
指定した文字列で検索して該当するものを表示するコマンドで、結果を絞るために使う
> 

## パーミッション

```bash
$ ls -l /bin/less
	-rwxr-xr-x. 1 root root 286424 10月 29日 2024 /bin/less
# -: ファイルタイプ
# rwx: オーナーのパーミッション
# r-x: グループのパーミッション
# r-x: その他のユーザーのパーミッション
```

パーミッションの詳細

| 記号 | 意味 | 詳細説明 |
| --- | --- | --- |
| `r` | read（読み取り） | ファイルの内容を読める、ディレクトリ内を一覧できる |
| `w` | write（書き込み） | ファイルの内容を変更できる、ディレクトリ内で作成・削除ができる |
| `x` | execute（実行） | ファイルを実行できる、ディレクトリへ移動できる |
| `-` | 権限なし | その操作は許可されていない |
- 各ファイルやディレクトリには、「**所有者（user）」「グループ（group）」「その他（other）」」の3つに対してそれぞれ `rwx` のセットがある
- 例：`rwxr-xr--`
    
    → 所有者：すべてOK、グループ：読み取り+実行のみ、その他：読み取りのみ
    

## スーパーユーザー

```bash
sudo <コマンド>
## コマンドの前にsudoをつけて実行
```

用途: 管理者権限を持つ特別なユーザー（rootユーザー）

具体例:
```
$ sudo mkdir /componemts
```
## オプションについて

```bash
コマンド [オプション] [引数]
```

- **オプション**：動作をカスタマイズするための追加指定
- **引数**：ファイル名やパスなど、コマンドが処理する対象

### オプション指定ルール

| 書き方 | 説明 | 例 |
| --- | --- | --- |
| `-x` | 短い形式（**1文字**） | `ls -l`（長い形式で表示） |
| `-xyz` | 短いオプションを**連結**できる | `ls -al` は `ls -a -l` と同じ |
| `--xxxx` | 長い形式（ロングオプション） | `ls --all` は `ls -a` と同じ意味 |
| `-x 値` | 値を取るオプション（短い形式） | `grep -e pattern file.txt` |
| `--xxx=値` | 値を取るオプション（長い形式） | `tar --file=backup.tar.gz --list` |

## コマンドの使い方を調べる

### `—help`

```bash
<コマンド>　--help
```

用途: <コマンド>の使い方を調べる（公式ドキュメント）

具体例:

```bash
$ ls --helpe
使用方法:
ls [オプション]...[ファイル]...
```

使用方法:

コマンドの概要、使用可能なオプション一覧を調べられる。**コマンドの概要を理解したい時に使う**

### `man` コマンド

```bash
man <調べたいコマンド名>
```

用途: <調べたいコマンド名>の使い方を`—help`より詳しく説明している(公式ドキュメント)

具体例:

```bash
$ man ls
NAME 
ls - list directory contents
$ man -k move　#キーワードからも検索できる
```

使用方法:

コマンドを使用方法が詳しく説明されているため、**コマンドを正しく理解するために使う**


## 最後に
最後まで読んでいただき、ありがとうございました。

ここまで読んでくださった方なら、もうお気づきかもしれませんが、Linuxを使うにはWindows PCでは環境構築が必要です。
さらに、Linuxの主要なコマンドの多くは、Windowsのコマンドプロンプトではそのまま使えません。

つまり、Macは最初からLinuxに近い環境が整っており、学習のハードルをグッと下げてくれます。
これだけでも、初心者がMacで学習を始めるのは、とても合理的な選択だと言えるのではないでしょうか。

実際、僕自身もMacを使って日々作業をしていますが、「これをWindows PCでやっていたら…」と想像するだけでゾッとします。
きっと、今より何倍も多く挫折していたでしょう。もしかしたら、エンジニアになることすら諦めていたかもしれません。

だからこそ、これから開発を始めるなら――
**「開発PCには、ぜひMacを！」**

## 参考教材
- [もう怖くないLinuxコマンド。手を動かしながらLinuxコマンドラインを5日間で身に付けよう](https://www.udemy.com/share/102dIu3@jgFyNYkZLW_dl0uo32GxCtCFwEuua6NU_fYNdYL8TXhOiVlgCnZTXiB_khyTDZl57A==/)
- [Linux標準教科書](https://linuc.org/textbooks/linux/)