初心者が最初に学んだ Unix/Linuxのディレクトリ構成とコマンドの由来

エンジニアの世界では当たり前に使われているUnixやLinuxのコマンドですが、初心者だった私が最初に学んだディレクトリ構成や、よく使ったコマンドをメモとして残します。言葉が省略されていることが多く感じたので、どんな由来か、どの単語を省略してその呼び名になっているのかを重点的に残しています。

# そもそも
## コマンドとは？
コマンドは、コンピュータに対する**指示**です。
マウスを使ってファイルを操作するように、キーボードから文字を入力してコンピュータに命令を送ることができます。UnixやLinuxでは、このコマンドを使って様々な操作を行います。

## シェルとは？
シェルは、**コマンドを受け付けてコンピュータに伝える**役割を担うプログラムです。
黒い画面に文字が並んでいる、いわゆる「コマンドラインインターフェース（CLI）」と呼ばれるものがシェルの一種です。特別な設定をせずとも、macOSのターミナルやLinuxのターミナルを起動すれば、すぐにコマンドを試せる環境が整っています。

それぞれのシェルの特徴をまとめると、以下のようになります。

| シェル     | 概要                               | 特徴                                                                   | カスタマイズ性 | 速度   | 学習難易度 |
| :------- | :--------------------------------- | :--------------------------------------------------------------------- | :----------- | :----- | :------- |
| **sh**   | シェルの元祖、シンプルで軽量           | シンプル、軽量、互換性高い、機能は最低限                                                 | 低         | 高     | 易       |
| **bash** | 標準的で高機能なシェル、広く利用されている | 高機能、標準的、情報が多い、スクリプトも強力                                               | 中         | 中     | 中       |
| **zsh**  | 多機能でカスタマイズ性に優れたシェル     | 多機能、高カスタマイズ性、強力な補完、テーマ/プラグイン、bash 上位互換                               | 高         | 中     | 中〜高     |
| **fish** | 初心者にも優しい親切設計のシェル       | 設定不要、オートサジェスト、独特なスクリプト（文法に互換性なし） | 低〜中       | 中     | 易       |

## コマンドとシェルの関係
**コマンド実行の流れ**は以下です。
![](https://storage.googleapis.com/zenn-user-upload/cc4237090246-20250215.png)

1. **コマンド入力 (ユーザー → シェル)**
   - ユーザーがターミナルなどのインターフェースを通じて、**シェル**にコマンドを入力します。
   - カーネルに直接コマンドを入力するわけではありません。シェルが窓口になります。

2. **シェルがコマンドを解釈・実行準備**
   - シェルは、入力されたコマンドを解析し、それが何のコマンドなのか、どのようなオプションや引数が指定されているのかを理解します。
   - 内部コマンド (シェル自身が持っているコマンド) か、外部コマンド (独立した実行ファイル) かを判断します。
   - 外部コマンドの場合は、その実行ファイルのパスを探し、実行準備を行います。

3. **シェルがカーネルに実行を依頼 (システムコール)**
   - シェルは、コマンドを実行するために、**Linuxカーネル**に**システムコール**という特別な命令を発行します。
   - システムコールは、シェルがカーネルに「〇〇という処理を実行してください」と依頼するための窓口です。
   - 例えば、外部コマンドを実行する場合は、`execve()` などのシステムコールを使って、カーネルにプログラムの実行を依頼します。

4. **Linuxカーネルがコマンド (プログラム) を実行**
   - カーネルは、シェルからの依頼を受け、**実際にコマンド (プログラム)** を実行します。
   - カーネルは、CPUやメモリなどのハードウェア資源を管理し、プログラムが正しく動作するように制御します。

5. **コマンド実行が終了、結果をシェルに通知**
   - カーネル上で実行されたコマンド (プログラム) が処理を終えると、その**結果 (終了ステータスや出力)** をシェルに返します。

6. **シェルがコマンドの結果をユーザーに出力**
   - シェルは、カーネルから受け取ったコマンドの実行結果 (標準出力、標準エラー出力など) を、ターミナルなどのインターフェースを通じて**ユーザーに表示**します。

# Unix/Linuxのディレクトリ構成とディレクトリ名の由来

Unix/Linuxのファイルシステムは、**ツリー構造**になっています。
一番上の階層を**ルートディレクトリ**と呼び、そこから枝分かれするようにディレクトリ（フォルダ）が配置されています。

主なディレクトリの役割は以下の通りです。ディレクトリ名は由来を知らないと単なる記号にしか見えないので、意図的に調べました。

| ディレクトリ | 由来                                                           | 役割                                                    |
| :--------- | :------------------------------------------------------------- | :------------------------------------------------------ |
| `/bin`     | **Bin**aries (バイナリ)                                         | 基本的なコマンド                                          |
| `/dev`     | **Dev**ices (デバイス)                                          | デバイスファイル（ハードウェアや周辺機器）                      |
| `/etc`     | **Etc**etera (その他)  <br> **E**ditable **T**ext **C**onfiguration (編集可能なテキスト設定) | システムの設定ファイル                                      |
| `/home`    | **Home** directories (ホームディレクトリ)                             | 各ユーザーのホームディレクトリ（個人のファイルや設定を保存する場所） |
| `/lib`     | **Lib**raries (ライブラリ)                                      | プログラムが利用するライブラリ                                |
| `/mnt`     | **M**ou**nt** (マウント)                                        | 一時的にファイルシステムをマウントする場所                        |
| `/root`    | **Root** directory (ルートディレクトリ)                             | システム管理者（rootユーザー）のホームディレクトリ               |
| `/sbin`    | **S**ystem **Bin**aries (システムバイナリ)                              | システム管理用のコマンド                                    |
| `/tmp`     | **T**e**mp**orary (テンポラリ、一時的な)                               | 一時ファイル                                              |
| `/usr`     | **U**nix **S**ystem **R**esources (ユニックスシステムリソース) <br> **U**ser **S**ystem **R**esources (ユーザーシステムリソース) | ユーザーが利用するプログラムやデータ                            |
| `/var`     | **Var**iable (バリアブル、可変の)                                   | 一時的なログファイルなど、可変長のデータ                    |

```
├── bin
├── dev
├── etc
├── home
│   └── ユーザー名 (例: user)
│       └── (ユーザーのホームディレクトリの中身...)
├── lib
├── mnt
├── root
├── sbin
├── tmp
├── usr
│   ├── bin
│   ├── lib
│   └── ... (その他 /usr 以下)
└── var
    ├── log
    ├── tmp
    └── ... (その他 /var 以下)
```

WindowsのエクスプローラーやmacOSのFinderでフォルダを開くのと同じように、コマンドを使ってディレクトリの中身を確認したり、移動したりすることができます。

# ファイル操作の基本コマンドとファイル名の由来

ここでは、ファイル操作でよく使った基本的なコマンドを並べています。

| コマンド     | 説明                                                                           | オプション   | オプションの説明                                                                 |
| :------- | :--------------------------------------------------------------------------- | :--------- | :--------------------------------------------------------------------------------- |
| `cd`     | **C**hange **D**irectory：ディレクトリ（フォルダ）を移動する                               |            |                                                                                    |
| `pwd`    | **P**rint **W**orking **D**irectory：現在のディレクトリを表示する                         |            |                                                                                    |
| `ls`     | **L**i**s**t：ディレクトリの中身（ファイルやディレクトリ）を一覧表示する                   | `-l`       | 詳細表示 (ファイルサイズ、更新日時など詳細な情報をリスト形式で表示)                                 |
|          |                                                                              | `-a`       | 隠しファイルも表示 (`.` で始まるファイルも表示)                                                     |
|          |                                                                              | `-F`       | ファイル種別記号を表示 (ディレクトリは `/`、実行可能ファイルは `*` などを末尾に付加)                         |
| `mkdir`  | **M**a**k**e **Dir**ectory：新しいディレクトリを作成する                               | `-p`       | 親ディレクトリも作成 (mkdir -p a/b/c のように、存在しない親ディレクトリもまとめて作成)                                 |
| `rmdir`  | **R**e**m**ove **Dir**ectory：空のディレクトリを削除する                                 |            |                                                                                    |
| `touch`  | ファイルを新規作成または更新日時を更新する                                                 |            |                                                                                    |
| `cp`     | **C**o**p**y：ファイルやディレクトリをコピーする                                     | `-p`       | タイムスタンプやパーミッションを保持 (コピー元ファイルの情報をそのままコピー先に反映)                                   |
|          |                                                                              | `-r`       | ディレクトリを再帰的にコピー (ディレクトリの中身もまとめてコピー。ディレクトリコピーに必須)                               |
|          |                                                                              | `-f`       | 強制的に上書き (コピー先に同名ファイルが存在する場合、確認なしで上書き)                                         |
|          |                                                                              | `-i`       | 上書き前に確認 (コピー先に同名ファイルが存在する場合、上書きするかどうか確認メッセージを表示)                                     |
|          |                                                                              | `-P`       | シンボリックリンクをリンクとしてコピー (シンボリックリンク自体をコピー。デフォルトはリンク先の実体をコピー)                               |
| `mv`     | **M**o**v**e：ファイルやディレクトリを移動する、またはファイル名を変更する                     | `-f`       | 強制的に上書き (移動先に同名ファイルが存在する場合、確認なしで上書き)                                         |
|          |                                                                              | `-i`       | 上書き前に確認 (移動先に同名ファイルが存在する場合、上書きするかどうか確認メッセージを表示)                                     |
| `rm`     | **R**e**m**ove：ファイルやディレクトリを削除する                                     | `-r`       | ディレクトリを再帰的に削除 (ディレクトリとその中身をまとめて削除。ディレクトリ削除に必須)                                 |
|          |                                                                              | `-i`       | 削除前に確認 (削除前に削除するかどうか確認メッセージを表示。誤削除を防ぐために推奨)                                       |
|          |                                                                              | `-f`       | 強制的に削除 (確認メッセージなしで強制的に削除。パーミッションがないファイルなどを削除する場合に使うことがあるが、通常は非推奨)                     |
| `ln`     | **L**i**n**k：ファイルやディレクトリへのリンクを作成する                                 | `-s`       | シンボリックリンクを作成 (ショートカットのようなリンクを作成。`-s` オプションなしでハードリンクを作成)                                 |
|          |                                                                              | `-f`       | 強制的に作成 (リンク先に同名ファイルが存在する場合、強制的に上書きしてリンクを作成)                                     |
| `cat`    | **Cat**enate：ファイルの内容をまとめて表示する                                      |            |                                                                                    |
| `echo`   | 文字列を表示する                                                                 |            |                                                                                    |
| `test`   | 条件式を評価する                                                                 |            |                                                                                    |

これらのコマンドを組み合わせることで、ファイルやフォルダの整理、プログラムの実行、テキストファイルの編集など、様々な操作をコマンドラインから実行できます。

## cd: ディレクトリを移動する

`cd` コマンドは、**C**hange **D**irectory の略で、作業するディレクトリを移動するために使用します。
Windows のエクスプローラーでフォルダをダブルクリックして移動するイメージです。

```bash
cd [移動したいディレクトリのパス]
```

### 絶対パスと相対パス

ディレクトリのパスを指定する方法には、**絶対パス**と**相対パス**の2種類があります。

*   **絶対パス**:  ルートディレクトリ `/` から始まる、目的のディレクトリまでの完全な道のりを示すパスです。
    住所で例えるなら、「〇〇県〇〇市...」のように、一番大きな場所から順番に場所を特定していくイメージです。

    ```bash
    cd /home/user/documents
    ```
    これは、「ルートディレクトリ (`/`)」の中の「home」ディレクトリの中の「user」ディレクトリの中の「documents」ディレクトリへ移動する、という意味になります。

*   **相対パス**: 現在いるディレクトリを基準にして、目的のディレクトリまでの道のりを示すパスです。
    住所で例えるなら、「〇〇さんの家の隣」のように、現在地から目的地までの関係性で場所を特定していくイメージです。

    ```bash
    cd documents
    ```

    現在 `/home/user/` ディレクトリにいる場合、このコマンドは「現在のディレクトリ (`/home/user/`)」の中の「documents」ディレクトリへ移動する、という意味になります。

    ```bash
    cd ../pictures
    ```
    現在 `/home/user/documents` ディレクトリにいる場合、このコマンドは「現在のディレクトリ (`/home/user/documents`)」の親ディレクトリ (`/home/user/`) に移動し、さらにその中の `pictures` ディレクトリへ移動する、という意味になります。
    `..` は「親ディレクトリ」を表します。

### よく使う `cd` コマンドの例

*   **ホームディレクトリへ移動**:

    ```bash
    cd ~
    ```

    または

    ```bash
    cd
    ```

    `~` はホームディレクトリを表します。
    引数なしで `cd` コマンドを実行した場合も、ホームディレクトリへ移動します。

*   **一つ上の階層へ移動**:

    ```bash
    cd ..
    ```

    `..` は親ディレクトリを表します。

*   **特定のディレクトリへ移動 (絶対パス)**:

    ```bash
    cd /usr/local/bin
    ```

*   **現在のディレクトリから見て、子ディレクトリへ移動 (相対パス)**:

    ```bash
    cd documents
    ```
    (現在のディレクトリに `documents` というディレクトリがある場合)

`cd` コマンドを使いこなすと、ファイルシステム内を自由自在に移動できるようになります。

## pwd: 現在のディレクトリを表示する

`pwd` コマンドは、**P**rint **W**orking **D**irectory の略で、**現在自分がどのディレクトリにいるのか**を確認するために使用します。
道に迷った時に、現在地を確認するようなイメージです。

```bash
pwd
```

このコマンドを実行すると、現在いるディレクトリの絶対パスが表示されます。

```bash
$ pwd
/home/user/documents
```

このように、`pwd` コマンドは、自分がファイルシステムのどこにいるのか分からなくなった時に、現在地を把握するのに役立ちます。

## ls: ディレクトリの中身を一覧表示する

`ls` コマンドは、**L**i**s**t の略で、ディレクトリの中身を**一覧表示**するために使用します。
Windows のエクスプローラーや macOS の Finder でフォルダを開いて、ファイルやフォルダを確認するイメージです。

```bash
ls [ディレクトリのパス]
```

ディレクトリのパスを省略した場合、**現在のディレクトリ**の中身が表示されます。

### よく使う `ls` コマンドのオプション

`ls` コマンドには、表示形式や表示する情報をカスタマイズするための様々なオプションがあります。
ここでは、特によく使うオプションをいくつか紹介します。

*   `-l` : **詳細表示** (long listing format)

    ファイルやディレクトリの詳細な情報（パーミッション、所有者、サイズ、更新日時など）を**リスト形式**で表示します。

    ```bash
    ls -l
    ```

    実行例：

    ```bash
    $ ls -l
    合計 4
    drwxr-xr-x 2 user user 4096 10月 26 10:00 documents
    -rw-r--r-- 1 user user   25 10月 25 15:00 sample.txt
    ```

    *   先頭の `drwxr-xr-x` や `-rw-r--r--` は**パーミッション**（ファイルやディレクトリのアクセス権）を表します。
        *   `d` で始まる場合はディレクトリ、`-` で始まる場合はファイルです。
    *   続く `2` や `1` は**リンク数**を表します。
    *   `user user` は**所有者**と**グループ**を表します。
    *   `4096` や `25` は**ファイルサイズ**をバイト単位で表します。
    *   `10月 26 10:00` や `10月 25 15:00` は**最終更新日時**を表します。
    *   最後の `documents` や `sample.txt` は**ファイル名**または**ディレクトリ名**を表します。

*   `-a` : **隠しファイル**も表示 (all)

    通常、Unix/Linux では、ファイル名やディレクトリ名が `.` (ドット) で始まるものは**隠しファイル**として扱われ、`ls` コマンドでは表示されません。
    `-a` オプションをつけると、隠しファイルも**含めて**すべて表示します。

    ```bash
    ls -a
    ```

    実行例：

    ```bash
    $ ls -a
    .  ..  .hidden_file  documents  sample.txt
    ```

    `.` と `..` は、それぞれ**現在のディレクトリ**と**親ディレクトリ**を表す特別なディレクトリです。

*   `-F` : ファイルの種類を**識別記号**で表示 (classify)

    ファイルの種類を**識別する記号**をファイル名の末尾に付加して表示します。

    *   `/` : ディレクトリ
    *   `*` : 実行可能ファイル
    *   `@` : シンボリックリンク
    *   `|` : FIFO (名前付きパイプ)
    *   `=` : ソケット

    ```bash
    ls -F
    ```

    実行例：

    ```bash
    $ ls -F
    documents/  executable_file*  symlink@  sample.txt
    ```

    `documents/` はディレクトリ、`executable_file*` は実行可能ファイル、`symlink@` はシンボリックリンクであることを示しています。

### 覚えておくと便利な `ls` のオプション組み合わせ

*   `-al` (または `-la`) : **隠しファイル**も**詳細表示**で表示

    ```bash
    ls -al
    ```

    隠しファイルの詳細情報も確認したい場合に便利です。

*   `-lF` (または `-Fl`) : **詳細表示**と**ファイル種別記号**を同時に表示

    ```bash
    ls -lF
    ```

    ファイルの種類を詳細情報と合わせて確認したい場合に便利です。

## mkdir: ディレクトリを作成する

`mkdir` コマンドは、**M**a**k**e **Dir**ectory の略で、**新しいディレクトリ**を作成するために使用します。
Windows のエクスプローラーや macOS の Finder で「新しいフォルダを作成」するイメージです。

```bash
mkdir [作成したいディレクトリ名]
```

作成したいディレクトリ名を指定します。

### `-p` オプション: 親ディレクトリも同時に作成

`-p` オプション (parents) をつけると、**親ディレクトリ**が存在しない場合でも、**同時に作成**することができます。

例えば、`mkdir -p a/b/c` というコマンドを実行すると、

1.  まず `a` ディレクトリが存在するか確認します。存在しない場合は作成します。
2.  次に `a` ディレクトリの中に `b` ディレクトリが存在するか確認します。存在しない場合は作成します。
3.  最後に `b` ディレクトリの中に `c` ディレクトリを作成します。

```bash
mkdir -p [作成したいディレクトリ名]
```

```bash
mkdir -p my_project/documents/reports
```

このコマンドは、`my_project` ディレクトリの中に `documents` ディレクトリを作成し、さらにその中に `reports` ディレクトリを作成します。
もし `my_project` ディレクトリや `documents` ディレクトリがまだ存在しなくても、まとめて作成してくれます。

## rmdir: 空のディレクトリを削除する

`rmdir` コマンドは、**R**e**m**ove **Dir**ectory の略で、**空のディレクトリ**を削除するために使用します。
Windows のエクスプローラーや macOS の Finder で空のフォルダを削除するイメージです。

```bash
rmdir [削除したいディレクトリ名]
```

削除したいディレクトリ名を指定します。

**注意点:** `rmdir` コマンドは、**空のディレクトリしか削除できません**。
ディレクトリの中にファイルやディレクトリが存在する場合は、エラーが表示されて削除できません。
空でないディレクトリを削除したい場合は、後述する `rm` コマンドを使用します。

## touch: ファイルを新規作成または更新日時を更新する

`touch` コマンドは、主に以下の2つの用途で使われるコマンドです。

1.  **空のファイルを新規作成する**
2.  **既存のファイルの更新日時を更新する**

Windows のエクスプローラーや macOS の Finder で右クリックして「新規作成」からファイルを作成するイメージに少し近いですが、`touch` コマンドは**中身が空っぽのファイル**を素早く作成することに特化しています。
また、ファイルの**更新日時**（ファイルが最後に更新された日時）を意図的に変更したい場合にも `touch` コマンドが役立ちます。

### `touch` コマンドの基本的な使い方

`touch` コマンドは、作成したいファイル名を指定するだけで、簡単に実行できます。

```bash
touch [ファイル名]
```

#### ファイルを新規作成する場合

例えば、`new_file.txt` という名前の新しい空のテキストファイルを作成したい場合は、以下のコマンドを実行します。

```bash
touch new_file.txt
```

このコマンドを実行すると、現在のディレクトリに `new_file.txt` という名前の**中身が空のファイル**が作成されます。
もし、同じ名前のファイルがすでに存在していた場合は、**新規作成ではなく、既存のファイルの更新日時が現在時刻に更新**されます。

#### ファイルの更新日時を更新する場合

既存のファイルの更新日時を現在時刻に更新したい場合も、同じように `touch` コマンドを使います。
例えば、`existing_file.txt` というファイルの更新日時を更新したい場合は、以下のコマンドを実行します。

```bash
touch existing_file.txt
```

このコマンドを実行すると、`existing_file.txt` ファイルの**内容**は**変更されませんが**、**更新日時**が**現在時刻**に更新されます。
ファイルの更新日時を更新することで、ファイルの整理やバックアップ作業などで、特定の期間に更新されたファイルを抽出したり、管理したりする際に役立ちます。

`touch` コマンドは、非常にシンプルで利用頻度の高いコマンドです。
特に、シェルスクリプトの中で、一時的なファイルを作成したり、ファイルの存在確認を兼ねて更新日時を更新したりする用途でよく利用されます。

## cp: ファイルやディレクトリをコピーする

`cp` コマンドは、**C**o**p**y の略で、**ファイル**や**ディレクトリ**を**コピー**するために使用します。
Windows のエクスプローラーや macOS の Finder でファイルをコピー＆ペーストするイメージです。

```bash
cp [コピー元] [コピー先]
```

*   **コピー元**: コピーしたいファイルまたはディレクトリのパスを指定します。
*   **コピー先**: コピー先のファイルまたはディレクトリのパスを指定します。

### `cp` コマンドのオプション

`cp` コマンドにも、コピーの動作をカスタマイズするための様々なオプションがあります。

*   `-p` : タイムスタンプやパーミッションを**保持**してコピー (preserve)

    ファイルの**更新日時**や**パーミッション**（アクセス権）などの情報を、**コピー後も元のファイルのまま**にしたい場合に`-p` オプションを使用します。
    バックアップなどで、ファイルの情報をそのまま保持したい場合に便利です。

    ```bash
    cp -p [コピー元ファイル] [コピー先ファイル]
    ```

*   `-r` : ディレクトリを**再帰的**にコピー (recursive)

    ディレクトリをコピーする場合、`-r` オプションが**必須**です。
    `-r` オプションをつけると、ディレクトリの中身（ファイルやサブディレクトリ）も**まとめて**コピーします。

    ※再帰的：ディレクトリの中にディレクトリがあった場合に、そのディレクトリに対して同様の処理を繰り返すという意味

    ```bash
    cp -r [コピー元ディレクトリ] [コピー先ディレクトリ]
    ```

*   `-f` : コピー先に同名ファイルが存在する場合、**強制的に上書き** (force)

    コピー先に**同じ名前のファイル**がすでに存在する場合、通常 `cp` コマンドは上書きしません。
    `-f` オプションをつけると、**確認メッセージを表示せずに強制的に上書き**します。
    上書きしても問題ない場合にのみ使用するのが望ましいです。

    ```bash
    cp -f [コピー元ファイル] [コピー先ファイル]
    ```

*   `-i` : コピー先に同名ファイルが存在する場合、**上書き前に確認** (interactive)

    コピー先に**同じ名前のファイル**がすでに存在する場合、**上書きするかどうか**を**確認メッセージ**で尋ねます。
    誤ってファイルを上書きしてしまうのを防ぎたい場合に便利です。

    ```bash
    cp -i [コピー元ファイル] [コピー先ファイル]
    ```

    実行例：

    ```bash
    $ cp -i sample.txt destination.txt
    cp: 'destination.txt' を上書きしてもよろしいですか? (yes/no [n])
    ```

    `yes` と入力すると上書き、`no` (または Enter キー) を入力すると上書きをキャンセルします。

*   `-P` : シンボリックリンクを**リンク**としてコピー (no dereference)

    コピー元が**シンボリックリンク**の場合、`-P` オプションをつけると、**シンボリックリンク**そのものをコピーします。
    デフォルトでは、シンボリックリンクが指す**実体ファイル**がコピーされます。

    ```bash
    cp -P [コピー元シンボリックリンク] [コピー先シンボリックリンク]
    ```

## mv: ファイルやディレクトリを移動、ファイル名を変更する

`mv` コマンドは、**M**o**v**e の略で、**ファイル**や**ディレクトリ**を**移動**したり、**ファイル名やディレクトリ名を変更**したりするために使用します。
Windows のエクスプローラーや macOS の Finder でファイルやフォルダを移動したり、名前を変更したりするイメージです。

```bash
mv [移動元] [移動先]
```

*   **移動元**: 移動または名前を変更したいファイルまたはディレクトリのパスを指定します。
*   **移動先**: 移動先のディレクトリのパス、または新しいファイル名/ディレクトリ名を指定します。

### ファイルやディレクトリの移動

ファイルやディレクトリを**別のディレクトリ**へ移動することができます。

```bash
mv [移動したいファイル/ディレクトリ] [移動先のディレクトリ]
```

```bash
mv sample.txt documents/
```

このコマンドは、`sample.txt` ファイルを `documents` ディレクトリへ移動します。

### ファイル名やディレクトリ名の変更

ファイルやディレクトリの**名前を変更**することができます。
移動先として**同じディレクトリ**を指定し、**新しいファイル名/ディレクトリ名**を指定します。

```bash
mv [変更したいファイル/ディレクトリ名] [新しいファイル/ディレクトリ名]
```

```bash
mv old_file_name.txt new_file_name.txt
```

このコマンドは、`old_file_name.txt` ファイルの名前を `new_file_name.txt` に変更します。

### `mv` コマンドのオプション

`mv` コマンドにも、動作をカスタマイズするためのオプションがいくつかあります。

*   `-f` : 移動先に同名ファイルが存在する場合、**強制的に上書き** (force)

    コピー先のディレクトリに**同じ名前のファイル**がすでに存在する場合、通常 `mv` コマンドは上書きしません。
    `-f` オプションをつけると、**確認メッセージを表示せずに強制的に上書き**します。
    上書きしても問題ない場合にのみ使用するように。

    ```bash
    mv -f [移動元ファイル] [移動先ファイル]
    ```

*   `-i` : 移動先に同名ファイルが存在する場合、**上書き前に確認** (interactive)

    移動先のディレクトリに**同じ名前のファイル**がすでに存在する場合、**上書きするかどうか**を**確認メッセージ**で尋ねます。
    誤ってファイルを上書きしてしまうのを防ぎたい場合に便利です。

    ```bash
    mv -i [移動元ファイル] [移動先ファイル]
    ```

    実行例：

    ```bash
    $ mv -i sample.txt documents/sample.txt
    mv: 'documents/sample.txt' を上書きしてもよろしいですか? (yes/no [n])
    ```

    `yes` と入力すると上書き、`no` (または Enter キー) を入力すると上書きをキャンセルします。

## rm: ファイルやディレクトリを削除する

`rm` コマンドは、**R**e**m**ove の略で、**ファイル**や**ディレクトリ**を**削除**するために使用します。
Windows のごみ箱にファイルを捨てるイメージですが、**コマンドで削除した場合、基本的にゴミ箱には移動せず、完全に削除される**ので、**慎重に**使用する必要があります。

```bash
rm [削除したいファイル/ディレクトリ]
```

*   **削除したいファイル**: ファイルを削除する場合、削除したいファイルパスを指定します。
*   **削除したいディレクトリ**: ディレクトリを削除する場合、`-r` オプションが必要です (後述)。

### `rm` コマンドのオプション

`rm` コマンドは、ファイルを**完全に削除**してしまうため、オプションをうまく活用して、誤作動を防ぐことが重要です。

*   `-r` : ディレクトリを**再帰的**に削除 (recursive)

    ディレクトリを削除する場合、`-r` オプションが**必須**です。
    `-r` オプションをつけると、ディレクトリの中身（ファイルやサブディレクトリ）も**まとめて**削除します。
    **ディレクトリを削除する場合は必ず `-r` オプションをつけることを忘れないように。**

    ```bash
    rm -r [削除したいディレクトリ]
    ```

    **非常に強力なオプションなので、誤って重要なディレクトリを削除してしまわないように、特に注意が必要です。**

*   `-i` : 削除前に**確認メッセージ**を表示 (interactive)

    ファイルを削除する前に、**削除するかどうか**を**確認メッセージ**で尋ねます。
    誤ってファイルを削除してしまうのを防ぎたい場合に便利です。
    **特に `-r` オプションと組み合わせて使う**ことで、ディレクトリ削除時の誤操作を防ぐ効果が期待できます。

    ```bash
    rm -i [削除したいファイル/ディレクトリ]
    rm -ri [削除したいディレクトリ] # -r と -i を同時に指定
    ```

    実行例：

    ```bash
    $ rm -i sample.txt
    rm: remove regular file 'sample.txt'? (y/n)
    ```

    `y` と入力すると削除、`n` (または Enter キー) を入力すると削除をキャンセルします。



    <br>`-ri` オプションの実行例：

    ```bash
    $ rm -ri documents/
    rm: descend into directory 'documents/'? (y/n) y
    rm: remove regular file 'documents/file1.txt'? (y/n) y
    rm: remove directory 'documents/'? (y/n) y
    ```

    ディレクトリ内のファイルやサブディレクトリ、ディレクトリ自体の削除について、それぞれ確認メッセージが表示されます。

*   `-f` : 確認メッセージを**表示せずに強制的に削除** (force)

    ファイルを削除する際に、**確認メッセージを表示せずに強制的に削除**します。
    **パーミッション（アクセス権）がないファイル**などを**無理やり削除したい場合**に使用することがありますが、**通常は使用を避けるべき**と言われています。
    誤って重要なファイルを削除してしまうリスクがあるため、**十分に注意して使用するのが望ましいです。**

    ```bash
    rm -f [削除したいファイル/ディレクトリ]
    ```

**`rm -r` コマンドは非常に強力で危険なコマンドです。**
誤って実行すると、**大切なデータ**を**完全に失ってしまう**可能性があります。
そのため、以下の点に注意します。

*   **削除するファイルやディレクトリを間違えないように、パスを十分確認する。**
*   **`-r` オプションはディレクトリ削除に必須だが、不用意に使うと広範囲に削除してしまう可能性があることを理解する。**
*   **`-f` オプションは基本的に使わないようにする。**
*   **`-i` オプションを積極的に活用し、削除前に必ず確認メッセージを確認する習慣をつける。**
*   **重要なデータのバックアップを必ず行う。**

## ln: リンクを作成する

`ln` コマンドは、**L**i**n**k の略で、ファイルやディレクトリへの**リンク**を作成するために使用します。
リンクには、**ハードリンク**と**シンボリックリンク**の2種類があります。
非エンジニアの方が日常的に使うのはシンボリックリンクの方が多いと思うので、**シンボリックリンク**を中心に説明します。

### シンボリックリンク (symbolic link)

**シンボリックリンク**は、**別のファイルやディレクトリを指し示す**ファイルです。
Windows のショートカットや macOS のエイリアスと似たようなものです。
シンボリックリンク自体は**ただのリンクファイル**で、実体ファイルとは別の場所に作成できます。

```bash
ln -s [リンク元ファイル/ディレクトリ] [作成するシンボリックリンク名]
```

*   `-s` : **シンボリックリンク**を作成するオプション (symbolic)
*   **リンク元ファイル/ディレクトリ**: リンクを張りたいファイルまたはディレクトリのパスを指定します。
*   **作成するシンボリックリンク名**: 作成するシンボリックリンクの名前とパスを指定します。

```bash
ln -s /home/user/documents/important_file.txt ~/デスクトップ/important_fileへのリンク
```

このコマンドは、`/home/user/documents/important_file.txt` ファイルへのシンボリックリンクを、ホームディレクトリ (`~`) の `デスクトップ` ディレクトリに `important_fileへのリンク` という名前で作成します。

デスクトップに作成された `important_fileへのリンク` を開くと、実体ファイルである `/home/user/documents/important_file.txt` が開かれます。

### ハードリンク (hard link)

**ハードリンク**は、**ファイルの実体**を**直接参照する**リンクです。
シンボリックリンクとは異なり、**別のファイル**としてinodeを共有するだけで、実体ファイルとほぼ同じように扱うことができます。
ハードリンクは、**ディレクトリには作成できません**。

```bash
ln [リンク元ファイル] [作成するハードリンク名]
```

*   `-s` オプションを**つけない**場合、**ハードリンク**が作成されます。
*   **リンク元ファイル**: リンクを張りたいファイルのパスを指定します。
*   **作成するハードリンク名**: 作成するハードリンクの名前とパスを指定します。

```bash
ln original_file.txt hardlink_file.txt
```

このコマンドは、`original_file.txt` ファイルへのハードリンクを、`hardlink_file.txt` という名前で作成します。

### `-f` オプション: リンクを強制的に作成する (force)

`-f` オプション (force) をつけると、**作成しようとするリンク名**が**すでに存在する場合**でも、**強制的に上書き**してリンクを作成します。

```bash
ln -sf [リンク元ファイル/ディレクトリ] [作成するシンボリックリンク名] # シンボリックリンクの場合
ln -f [リンク元ファイル] [作成するハードリンク名] # ハードリンクの場合
```

## cat: ファイルの内容を表示する

`cat` コマンドは、**Cat**enate の略で、**ファイルの内容**を**まとめて表示**するために使用します。
テキストファイルの中身を**手軽に確認したい**時に便利です。

```bash
cat [ファイル名]
```

```bash
cat sample.txt
```

このコマンドは、`sample.txt` ファイルの内容をターミナル画面に表示します。

**複数のファイルを指定**することもでき、その場合、**ファイルの内容を連結して表示**します。

```bash
cat file1.txt file2.txt file3.txt
```

## echo: 文字列を表示する

`echo` コマンドは、**文字列**を**表示**するために使用します。
コマンドの結果やメッセージを画面に表示したり、**ファイルに書き込んだり**する際に使用します。

```bash
echo [表示したい文字列]
```

```bash
echo "Hello, world!"
```

このコマンドは、`Hello, world!` という文字列をターミナル画面に表示します。

### リダイレクトと組み合わせる

`echo` コマンドと**リダイレクト**を組み合わせることで、**ファイルに文字列を書き込む**ことができます。

*   `>` : **上書きリダイレクト**。ファイルの内容を**上書き**します。
*   `>>` : **追記リダイレクト**。ファイルの内容の**末尾に追記**します。

```bash
echo "This is a new line." > output.txt
```

このコマンドは、`output.txt` ファイルを**新規作成**し、`This is a new line.` という文字列を**書き込み**ます。
もし `output.txt` ファイルがすでに存在する場合、**内容を上書き**します。

```bash
echo "This is another line." >> output.txt
```

このコマンドは、`output.txt` ファイルの**末尾に** `This is another line.` という文字列を**追記**します。
もし `output.txt` ファイルが存在しない場合は、**新規作成**して書き込みます。

## test: 条件式を評価する

`test` コマンドは、**条件式**を**評価**するために使用します。
ファイルの種類や存在確認、文字列の比較、数値の比較など、様々な条件を評価し、**真 (true) または 偽 (false) **を返します。
`test` コマンドは、主に**シェルスクリプト**の中で、**条件分岐**を行う際などに利用されます。

```bash
test [条件式]
```

または、`[` と `]` で条件式を囲むことでも同じように `test` コマンドを実行できます。

```bash
[ [条件式] ]
```

例：ファイルが存在するか確認する

```bash
test -e sample.txt
```

または

```bash
[ -e sample.txt ]
```

*   `-e` : ファイルまたはディレクトリが**存在**するかどうかを判定する条件式

条件式の結果は、**終了ステータス**という値で確認できます。

*   **終了ステータス `0`**: 条件式が**真 (true)** の場合
*   **終了ステータス `1`**: 条件式が**偽 (false)** の場合

終了ステータスは、`echo $?` コマンドで確認できます。

```bash
$ test -e sample.txt
$ echo $?
0 # sample.txt が存在する場合

$ test -e not_exist_file.txt
$ echo $?
1 # not_exist_file.txt が存在しない場合
```

`test` コマンドは、単独で使用するよりも、**シェルスクリプト**の中で `if` 文などと組み合わせて使用することで、より効果を発揮します。

# 基本コマンドのまとめ

今回の記事では、Unix/Linux の基本コマンドの中から、ファイル操作に関する基本コマンドを中心に紹介しました。

*   `cd`: ディレクトリ移動
*   `pwd`: 現在のディレクトリ表示
*   `ls`: ディレクトリ内容一覧表示
*   `mkdir`: ディレクトリ作成
*   `rmdir`: 空ディレクトリ削除
*   `touch`: ファイル新規作成/更新日時更新
*   `cp`: ファイル/ディレクトリコピー
*   `mv`: ファイル/ディレクトリ移動、ファイル名変更
*   `rm`: ファイル/ディレクトリ削除
*   `ln`: リンク作成
*   `cat`: ファイル内容表示
*   `echo`: 文字列表示
*   `test`: 条件式評価

これらのコマンドを組み合わせることで、ファイルやフォルダの操作を効率的に行うことができます。

他にも、**テキストファイルの中身を操作するコマンド**や、**より応用的なコマンド**もあります。そのあたりはまた別の機会に。

# 実践！基本コマンドを使ってみる

**シナリオ:**
あなたは新しいプロジェクトを始めます。
まず、プロジェクト専用のディレクトリを作成し、そこにドキュメントのテンプレートファイルをコピーして、不要になったテンプレートファイルを削除する、という作業を行います。

**作業手順:**

1. **ホームディレクトリへ移動:**

   まず、作業を始める場所として、ホームディレクトリに移動しましょう。
   ターミナルで以下のコマンドを実行してください。

   ```bash
   cd ~
   ```

   または、単に

   ```bash
   cd
   ```

   これは、`cd` コマンドを引数なしで実行することで、ホームディレクトリに移動する、という意味でしたね。

2. **プロジェクト用ディレクトリを作成:**

   次に、プロジェクト専用のディレクトリを作成します。
   ここでは、`my_project` という名前のディレクトリを作成してみましょう。
   以下のコマンドを実行してください。

   ```bash
   mkdir my_project
   ```

   これは、`mkdir` コマンドで `my_project` という名前のディレクトリを作成する、という意味ですね。
   コマンド実行後、`ls` コマンドで `my_project` ディレクトリが作成されたことを確認してみましょう。

   ```bash
   ls
   ```

   ターミナルに `my_project` というディレクトリ名が表示されていれば成功です。

3. **プロジェクト用ディレクトリへ移動:**

   作成した `my_project` ディレクトリへ移動します。
   以下のコマンドを実行してください。

   ```bash
   cd my_project
   ```

   これで、作業ディレクトリが `my_project` ディレクトリに移動しました。
   現在どのディレクトリにいるか `pwd` コマンドで確認してみましょう。

   ```bash
   pwd
   ```

   ターミナルに `/home/ユーザー名/my_project` (ユーザー名はあなたのユーザー名に置き換えてください) のように表示されれば成功です。

4. **テンプレートファイルを作成:**

   次に、ドキュメントのテンプレートとなる空のファイルを作成します。
   ここでは、`template.txt` という名前のファイルを作成してみましょう。
   以下のコマンドを実行してください。

   ```bash
   touch template.txt
   ```

   `touch` コマンドは、**空のファイル**を**新規作成**したり、既存のファイルの**更新日時を更新**したりするコマンドです。
   ここでは、ファイルが存在しない状態で `touch` コマンドを実行するので、新規ファイルが作成されます。

   `ls` コマンドで `template.txt` ファイルが作成されたことを確認してみましょう。

   ```bash
   ls
   ```

   ターミナルに `template.txt` というファイル名が表示されていれば成功です。

5. **テンプレートファイルをコピーしてファイル名を変更:**

   作成した `template.txt` ファイルをコピーして、ファイル名を `report.txt` に変更します。
   以下のコマンドを実行してください。

   ```bash
   cp template.txt report.txt
   ```

   これは、`cp` コマンドで `template.txt` を `report.txt` という名前で**コピー**する、という意味ですね。
   `ls` コマンドで `report.txt` ファイルが作成されたことを確認してみましょう。

   ```bash
   ls
   ```

   ターミナルに `report.txt` と `template.txt` の2つのファイル名が表示されていれば成功です。

6. **テンプレートファイルを削除:**

   テンプレートファイル `template.txt` はもう不要になったので、削除しましょう。
   以下のコマンドを実行してください。

   ```bash
   rm template.txt
   ```

   これは、`rm` コマンドで `template.txt` ファイルを**削除**する、という意味ですね。
   `ls` コマンドで `template.txt` ファイルが削除され、`report.txt` ファイルだけが残っていることを確認してみましょう。

   ```bash
   ls
   ```

   ターミナルに `report.txt` ファイル名のみが表示されていれば成功です。

7. **ホームディレクトリへ戻る:**

   最後に、作業を終えたので、ホームディレクトリへ戻りましょう。
   最初と同じ `cd ~` コマンドを実行します。

   ```bash
   cd ~
   ```

   または

   ```bash
   cd
   ```

   `pwd` コマンドでホームディレクトリに戻ったことを確認しておきましょう。

   ```bash
   pwd
   ```

   ターミナルに `/home/ユーザー名` (ユーザー名はあなたのユーザー名) のように表示されれば成功です。

**まとめ:**

お疲れ様でした！
これで、一連のコマンド操作で、

*   ディレクトリの**移動** (`cd`)
*   ディレクトリの**作成** (`mkdir`)
*   ファイルの**作成** (`touch`)
*   ファイルの**コピー** (`cp`)
*   ファイルの**削除** (`rm`)

といった、基本的なファイル操作を行うことができました。

今回の例は簡単なものですが、これらの基本コマンドを組み合わせることで、より複雑なファイル操作や、自動処理なども実現できるようになります。