【Linux】基本的なコマンドと使い方を理解する

### はじめに
今回はLinuxの基本的なコマンドに学んだことを、まとめていきます！

### `mkdir` コマンド - ディレクトリを作成する
```bash
mkdir <ディレクトリ名>
```

#### `-p` オプションで、親ディレクトリを含め複数作成できる
```bash
mkdir -p hoge/foo/bar
```

---

### `touch` コマンド - ファイルを作成する
```bash
touch <ファイル名>
```

#### 半角スペース区切りで指定することで、複数のファイルを一度に作成できる
```bash
touch hoge1 hoge2 hoge3
```

---

### `rm` コマンド - ファイルを削除する
```bash
rm <ファイル名>
```

#### `-r` オプションで、ディレクトリを削除できる  
ディレクトリ内にある全てのファイルも一緒に削除されるので注意
```bash
rm -r <ディレクトリ名>
```

#### 削除前に確認をしたい場合は `-i` オプションを使用
```bash
rm -i <ファイル名>
```

---

### `rmdir` コマンド - 空のディレクトリを削除する
```bash
rmdir <ディレクトリ名>
```

指定したディレクトリが空でない場合、エラーが発生し削除されない

---

### `cat` コマンド - ファイルの内容を表示する
```bash
cat <ファイル名>
```

#### touchと同様に半角スペース区切りで複数のファイルを指定できる
```bash
cat <ファイル名1> <ファイル名2>
```
複数指定した場合、連結してファイルの中身が表示される

#### `-n` オプションを使用することで行番号を表示できる
```bash
cat -n <ファイル名>
```

---

### `less` コマンド - ファイルをスクロール可能な状態で表示する
```bash
less <ファイル名>
```

#### lessコマンド実行時の操作

| 操作キー                     | 機能                                       |
|-----------------------------|------------------------------------------|
| **スペースキー / f / Ctrl + v** | 1画面下にスクロール                         |
| **b / Meta + v**             | 1画面上にスクロール                         |
| **j / Ctrl + n / Enter**     | 1行下にスクロール                           |
| **k / Ctrl + p**             | 1行上にスクロール                           |
| **q**                        | lessコマンドの終了                          |
| **/**                        | ファイル内検索                              |

#### 検索時の操作

| 操作キー                     | 機能                                       |
|-----------------------------|------------------------------------------|
| **/<文字列>**                | 下方向に向かって検索                        |
| **?<文字列>**                | 上方向に向かって検索                        |
| **n**                        | 次の検索結果に移動                          |
| **N**                        | 前の検索結果に移動                          |

---

### `cp` コマンド - ファイルやディレクトリをコピーする
```bash
cp <コピー元> <コピー先>
```

#### `-r` オプションでディレクトリを再帰的にコピー可能
```bash
cp -r <コピー元ディレクトリ> <コピー先ディレクトリ>
```

#### 上書き確認をしたい場合は `-i` オプションを使用
```bash
cp -i <コピー元> <コピー先>
```

---

### `mv` コマンド - ファイルを移動する、ファイル名を変更する
```bash
mv <移動元> <移動先>
```

#### ファイル名を変更する場合は以下のように指定
```bash
mv <旧ファイル名> <新ファイル名>
```

#### 上書き確認を行いたい場合は `-i` オプションを使用
```bash
mv -i <移動元> <移動先>
```

---

### `ln` コマンド - リンクを作成する
#### リンクとは？
Linuxのファイルシステムではファイルに別名をつけることができる。この機能を「リンク」と呼び、別名をつけることを「リンクを張る」と表現する。リンクにはハードリンクとシンボリックリンクの2種類存在する。

#### ハードリンク
```bash
ln <リンク元> <リンク名>
```  

リンク元の参照を保持した、リンクファイルを作成できる。リンクファイルを削除しても、リンク元のファイルは残る。

#### 例
```bash
ln hoge hogelink
```

hogeというファイルのリンクを持ったhogelinkが作成される。  
hogelinkに対して
```bash
cat hogelink
```
等を実行すると、リンク元であるhogeの内容が表示される。1つのファイルの実態に複数の名前をつける機能がハードリンク。

#### ハードリンクの削除
`rm` コマンドで削除できる。リンク元のファイルは、全てのハードリンクが削除された時に、リンク元のファイルも削除される。

---

#### シンボリックリンク
ハードリンクはディレクトリに対して作成できない、異なるディスク間をまたぐことができないという制限がある。シンボリックリンクはそれらの制限を受けない（ハードリンクよりもよく使用される）。

#### `-s` オプションを使用することでシンボリックリンクを作成できる
```bash
ln -s <リンク元> <リンク名>
```

#### `ls -l` コマンドでリンク先を確認できる
```bash
ls -l <リンク名>
```

`ls -l`コマンドの出力結果例：
```bash
lrwxrwxrwx 1 hoge hoge 5 10月 4 00:00 hoge2 -> hoge1
```
先頭の「l」はhoge2がシンボリックリンクであることを示している。そして`hoge2 -> hoge1`はhoge2というシンボリックリンクがhoge1のファイルの参照を持つことを表現している。

---

### シンボリックリンクの削除
`rm` コマンドでシンボリックリンクを削除する。ハードリンクと違い、リンク先のファイルには影響を与えない。
```bash
rm <リンク名>
```

シンボリックリンクを残したまま、リンク先の実態のファイルを削除できるが、その場合、リンクが壊れた状態になる。

---

### シンボリックリンクの利用例
#### 長いパスを省略する
**例**
```bash
ln -s /deep/path/to/directory shortcut
```
`shortcut` というリンクで深いディレクトリ階層にアクセスできる。

---

#### 複数バージョンのプログラムを管理する
```bash
ln -s /path/to/ver1.0.0 latest
```
これで`latest`というリンクはver1.0.0を参照するようになる。  
`latest`のリンク先を変更することで、バージョンの切り替えを行える。

#### バージョンを切り替える例
```bash
ln -sfn /path/to/ver1.0.1 latest
```
上記のようにすることで、`latest`はver1.0.1になる。

---

### まとめ
以上基本的なコマンドのまとめでした！
これらのコマンドぐらいは、作業中、すぐに使用できるように覚えられるようにしていきたいです！