Linux の基本操作を覚える

## はじめに

Linux でコマンド入力する際の備忘録です。
最初に Linuxとは？ についても少し触れています。

また、Linux 環境の構築手順については [こちら](https://qiita.com/yuk1_sys/items/62a7ef7bfa268fd84700) にまとめています。

#### 対象読者

- Linux 初学者
- Linux の基本コマンドについてざっくり復習したい方



## Linux について

まずは Linux について復習します。

Linux は OS の一種です。
特徴として、以下が挙げられます。
- CUI によるコマンド操作
- 軽量で動作が速い
- オープンソースソフトウェアとして広く公開・配布されているため、誰でも無料で利用することが可能

OS の有名どころとして windows、macOS などがありますが、それらより安価に利用できるため、世の中にリリースされているアプリケーションのサーバ側処理には、Linux がよく用いられています。


### Linux 関連で覚えておきたいこと

| 用語 | 説明 |
|:-|:-|
| カーネル | ユーザーの指示（コマンド）をハードウェアに正しく反映させる OS の中核部分 |
| シェル | ユーザとカーネルの接続面となっており、ユーザが入力したコマンドをカーネルに渡す役割を担っている |
| コマンド | カーネルにアクセスするためのプログラム |

シェルを割り当てられたユーザがコマンドを実行して、カーネルを通じてハードウェアの操作を行います。

また、代表的なシェルには bash、csh、zsh がありまして、現在 bash、zsh が広く利用されているようです。



## コマンド一覧

### man コマンド

コマンドなどのマニュアルを表示（man は manual の略）

##### man 実行後のコマンドライン操作一覧

| キー | 操作 |
|:-|:-|
| q | コマンドを終了する |
| d | 画面を半分進める |
| u | 画面を半分戻る |
| f | 1画面進める |
| b | 1画面戻る |
| g | 頭まで移動する |
| G | 末まで移動する |
| { N }G | N行目まで移動する |
| / | 下方向に検索<br>（n：下方向に次のものを検索、N：上方向に次のものを検索） |
| ? | 上方向に検索<br>（n：上方向に次のものを検索、N：下方向に次のものを検索） |


### date コマンド

日時を表示

##### date のフォーマット

| フォーマット | 意味 |
|:-|:-|
| %Y | 年 |
| %m | 月（6 月の場合 06） |
| %d | 日（1 日の場合 01） |
| %H | 時（00 .. 23） |
| %M | 分（00 .. 59） |
| %S | 秒（00 .. 59） |
| %u | 曜日（1 .. 7 , 1 が月曜） |

※ フォーマットを利用する際はクオート（ ' or " ）で囲い、頭に + をつける

```bash:フォーマットの使用例
date '+%Y/%m/%d %u %H:%M:%S'

// 実行結果
// 2024/05/03 5 00:14:15
```

##### date のオプション

| コマンド | 意味 |
|:-|:-|
| date -d '1 day' | 1 日後 |
| date -d '3 days ago' | 3 日前 |

##### 日本時刻を表示されるように変更する

デフォルトではイギリス時刻となっているので日本時刻に変更します。

`/etc/localtime` にどの国の時刻を表示するかが記述されているので、このファイルを修正します。
`mv` コマンドで念の為バックアップを取得し、`ln` コマンドで `/etc/localtime` が東京の時刻を向くようにファイルをリンクさせます。

```bash:コマンド
mv /etc/localtime /etc/localtime.bk
ln -s /user/share/zoneinfo/Asia/Tokyo /etc/localtime
```


### echo コマンド

ディスプレイ上に引数として与えた文字列を表示

##### echo のオプション

| コマンド | 意味 |
|:-|:-|
| echo -e | バックスラッシュを含む文字を特殊文字として解釈する<br>（¥n：改行、¥t：タブ、¥a：アラート　など） |
| echo サンプル >> file.txt | file.txt に サンプル と書き込む<br>file.txt が存在しない場合は新規作成となり、存在する場合は追加で書き込まれる |


### touch コマンド

ファイルの作成、タイムスタンプ（ファイルの作成日時、更新日時、アクセス日時などの属性情報）の変更に用いる

##### touch のオプション

| コマンド | 意味 |
|:-|:-|
| touch -a | ファイルのアクセス日時を変更する |
| touch -m | ファイルの更新日時を変更する |
| touch -d | ファイルの作成日時を指定してファイルを作成する |

※ 日時の書式に関しては日本のものでも海外のものでも問題なく実行される


### ls コマンド

ディレクトリ内に存在するファイルやディレクトリの一覧を表示する

##### ls のオプション

| コマンド | 意味 |
|:-|:-|
| ls ディレクトリ名 | ディレクトリの中にあるファイル、ディレクトリを表示 |
| ls -a | 隠しファイル（ . で始まるファイル）も表示 |
| ls -l | 詳細情報（所有者、権限、更新日時、ファイルサイズ）も表示 |
| ls -1 | 縦方向に表示 |
| ls -t | 更新日時で降順に表示 |
| ls -tr | 更新日時で昇順に表示 |
| ls -R | ディレクトリの中身も全て表示 |
| ls file* | fileで始まるファイルだけ表示 |
| ls *file | fileで終わるファイルだけ表示 |
| ls \*file* | fileを含むファイルだけ表示 |


### mkdir コマンド

ディレクトリを作成する

##### mkdir のオプション

| コマンド | 意味 |
|:-|:-|
| mkdir -p | ディレクトリの中に新たなディレクトリを一度に作成する |


### cd コマンド

ディレクトリを移動する（cd は change directory の略）

##### cd の使い方

| コマンド | 意味 |
|:-|:-|
| cd . | カレントディレクトリに移動（変わらない） |
| cd .. | カレントディレクトリの親ディレクトリに移動 |
| cd dir1 | dir1 ディレクトリに移動 |
| cd ../dir2 | 親ディレクトリにある dir2 ディレクトリに移動 |
| cd /tmp | rootディレクトリ直下の tmp ディレクトリに移動（絶対パス） |
| cd ~ | ホームディレクトリに移動（例：root/home/ec2-user ） |

※ ディレクトリの入力途中で Tab キーを押すと候補となるディレクトリ名が表示される


### pwdコマンド

カレントディレクトリ（ユーザが現在いるディレクトリ）を表示する


### mv コマンド

ファイルの移動、名前の変更を行うコマンド

##### mv の使い方

| コマンド | 意味 |
|:-|:-|
| mv file.txt dir1/ | file.txt を dir1 ディレクトリに移動 |
| mv file.txt file2.txt | file.txt を file2.txt にリネーム |
| mv file.txt dir1/file2.txt | file.txt を file2.txt にリネームして dir1 ディレクトリに移動 |
| mv *txt dir1 | txt で終わるファイルを dir1 ディレクトリに移動 |


### cp コマンド

ファイルやディレクトリをコピーして新たに作成する

##### cp のオプション

| コマンド | 意味 |
|:-|:-|
| cp -f | コピー先に同名のファイルがあっても強制的に上書いてコピー |
| cp -i | コピー先に同名のファイルがあれば、コピーするか確認する |
| cp -p | コピー元のファイルの属性（所有者、アクセス権、タイムスタンプ）もコピー |
| cp -r | ディレクトリをコピー |


### cat コマンド

ファイルの中身をディスプレイ上に表示する
catはconcatenate（連携する）が由来

##### cat のオプション

| コマンド | 意味 |
|:-|:-|
| cat -n | すべての行に行番号をつけて表示 |
| cat -b | 空白行以外の行に行番号をつけて表示 |
| cat -b | 空白行以外の行に行番号をつけて表示 |
| cat file1.txt file2.txt | file1.txt と file2.txt の中身を結合したテキストを表示 |
| cat file1.txt file2.txt >> file3.txt | file1.txt と file2.txt の中身を結合したテキストを file3.txt に書き込む |


### rmdir コマンド

空ディレクトリを削除する（ディレクトリが空でない場合はエラー）

##### rmdir のオプション

| コマンド | 意味 |
|:-|:-|
| rmdir -p | 空ディレクトリを中身も含めて削除する |


### rm コマンド

ファイル、ディレクトリを削除する

##### rm のオプション

| コマンド | 意味 |
|:-|:-|
| rm -f | 強制的に削除する |
| rm -i | 削除するかどうか確認する |
| rm -r | ディレクトリ内のファイル、ディレクトリも含めディレクトリを削除する |


### which コマンド

コマンドを指定した際に実行されるファイルがどこに存在するのか表示する



## ショートカット一覧


### Tab

途中まで入力した状態から、コマンドやファイルなど入力候補を表示する


### ctrl + a, ctrl + e

カーソルを左端、右端に移動させる


### ctrl + b, ctrl + f

カーソルを 1 つ左、右に移動させる


### ctrl + h, BackSpace

カーソルの左にある文字を削除


### ctrl + d

カーソルの位置にある文字を削除


### ctrl + u

カーソル一の左から文頭までの文字を削除する


### ctrl + k

カーソル位置から文末までの文字を削除する


### ctrl + w

カーソル位置から左に単語 1 つ削除


### ctrl + l

画面を綺麗にクリアにする


### ctrl + s, ctrl + q（Macは使用不可）

画面への入力内容がターミナル上に表示されなくなる（ ctrl + q で元に戻す）


### ctrl + r

以前実行したコマンドを検索する

##### ctrl + r で検索をかけた後の操作

| ショートカット | 動作 |
|:-|:-|
| Enter | 検索結果を実行する |
| tab | 検索結果をターミナルに入力された状態にする |
| ctrl + r | 次の検索結果を表示する |


### !!

直前に実行したコマンドを再実行する


### !〇〇

〇〇で始まる最も最近のコマンドを実行



## ファイル編集（vi コマンド）

`vi ファイル名` でファイルを編集する（ファイルが存在しない場合は作成する）

##### コマンドモード

| 入力キー | 動作 |
|:-|:-|
| x: | カーソル位置にある 1 文字削除 |
| dd: | 1 行削除 |
| d100d: | 100 行削除 |
| yy: | 行をコピー |
| p: | コピーした行や文字をペースト |
| {}: | 1 ブロック移動 |
| u: | 変更を元に戻す |
| ctrl + r: | 変更を進める |
| gg: | ファイルの一番上に移動 |
| G: | 最終行に移動 |
| 100G: | 100 行目に移動 |
| /: | 下方向の文字を検索 |
| ?: | 上方向に文字を検索 |
| :q! | ファイルを保存せず終了 |
| :w | vi は終了せずファイルを保存 |
| :wq | vi を終了してファイルを保存 |

##### コマンドモードと入力モード間を移動する

| 入力キー | 動作 |
|:-|:-|
| i: | 現在のカーソル位置から入力 |
| a: | 現在のカーソル位置の 1 つ右から入力 |
| A: | 現在のカーソル位置の文末から入力 |
| O: | 1 つ上に行を追加して入力 |
| o: | 1 つ下に行を追加して入力 |
| Esc | 入力モードからコマンドモードに |

##### 高度な vi コマンドの使い方

| 入力キー | 動作 |
|:-|:-|
| :sp ファイル名 | 画面の水平方向に分割 |
| :vsp ファイル名 | 画面の垂直方向に分割 |
| ctrl + w を 2 回実行 | 分割した画面間を移動 |
| :%s/old/new/g | 文字列を全て置換（old のものを new にする） |
| :set number | ファイルの行番号を表示する |
| :!コマンド | vi 実行中にコマンドを実行する |
| :!%:p | ファイルを実行する（実行する際には、:w でファイルを保存すること） |

**【各文字の意味】**
**:**　>>　コマンドモード
**!**　>>　shell コマンドの実行
**%**　>>　編集のファイルへのリンク
**:p**　>>　絶対パスを表す



## vim を使ったファイル編集

vim とは vi に似た操作性でより高機能のエディタである。

CentOS では `yum install vim`、Debian系では `apt install vim` でインストールする。
※ vim をインストールする際は `su` コマンドで管理者権限のあるユーザに変更する

##### vim 特有のコマンド

| 入力キー | 動作 |
|:-|:-|
| :vertical diffsplit 差分を取りたいファイル | 2 つのファイルの差分を取って比較する |



## ユーザ情報の更新と権限の変更

Linuxにはユーザとグループが存在しており、ユーザは特定のグループに所属する。

- 各ファイル、ディレクトリは編集・参照・実行の 3 つの権限を設定することができる
- 権限はユーザ、またはグループ単位で設定できる
- ユーザがファイルに対して編集権限を持っていない場合でも、所属グループが編集権限を持っている場合は編集が可能である


### useradd コマンド

OS上にユーザを追加するコマンド（root ユーザで実行する）

useradd をオプションなしで実行すると、同じ名前のグループが作成されて所属する。

##### /etc/passwd について

作成されたユーザ一覧が記述されているファイル。

ユーザ情報は、`ユーザ名:暗号化パスワード:ユーザID:グループID:コメント:ホームディレクトリ:ログインシェル` のように記述されている。 

また、暗号化パスワードの部分が x になっている場合は、パスワードを暗号化した上で `/etc/shadow` に保存される。

##### /etc/group について

作成されたグループ一覧が記述されているファイル。

グループ情報は、`グループ名:暗号化パスワード:グループID:ユーザリスト` のように記述されている。

また、暗号化パスワードの部分が x になっている場合は、パスワードを暗号化した上で `/etc/gshadow` に保存される。

##### useradd のオプション

| オプション | 意味 |
|:-|:-|
| -d | ホームディレクトリを指定 |
| -g | 所属するプライマリグループを指定 |
| -s | ログインシェルを指定 |


### usermod コマンド

ユーザ情報を変更するコマンド

##### usermod のオプション

| オプション | 意味 |
|:-|:-|
| -c | コマンドを変更 |
| -d | ホームディレクトリを変更 |
| -g | 所属するプライマリグループを変更 |
| -s | ログインシェルを変更 |
| -l | ユーザ名の変更 |
| -L | ユーザをロック（ログインできなくなる） |
| -U | ユーザのロック解除 |


### userdel コマンド

ユーザを削除するコマンド


### groupadd コマンド

グループを追加するコマンド


### groupdel コマンド

グループを削除するコマンド


### groupmod コマンド

グループ情報の変更

##### groupmod のオプション

| オプション | 意味 |
|:-|:-|
| -g | グループIDの変更 |
| -n | グループ名の変更 |


### passwd コマンド

ユーザのパスワードを変更する


### chown コマンド

指定したファイル、ディレクトリの所有するユーザ、グループの変更

##### chown のオプション

| オプション | 意味 |
|:-|:-|
| -R | ディレクトリの中身の所有者も再帰的に変更する |


### chmod コマンド

ファイルの権限を変更するコマンド

##### chmod のオプション

| オプション | 意味 |
|:-|:-|
| -R | ディレクトリの中身の所有者も再帰的に変更する |

##### 権限の付与方法

権限は以下のように定義され、数字を足し合わせることでファイルやディレクトリに設定されている権限を表現することができる。

**r** : 読み込み権限（ 4 ）
**w** : 書き込み権限（ 2 ）
**x** : 実行権限（ 1 ）

例えば、読み込み権限と書き込み権限を持っている場合は 4 + 2 = 6 と表現し、全ての権限を持っている場合は 4 + 2 + 1 = 7 と表現する。

また、権限を付与する際は、所有ユーザ、所有グループ、その他ユーザの順で数字を並べるため、`chmod 644 file.txt` とした場合は以下の権限設定に変更される。

**所属ユーザ**：読み込み（r） + 書き込み（w）
**所属グループ**：読み込み（r）
**その他ユーザ**：読み込み（r）



## 締め

頻繁に使わないやつってすぐ忘れちゃうんだよなあ