Linuxコマンドをまとめてみた

## はじめに
今回は学習用outputとしてLinuxのコマンドをまとめています。

## ディレクトリ
### ディレクトリとは
ファイルが保存されている場所のこと
windowsやMacのフォルダと同じ構造
**ディレクトリは入れ子構造になっている**

### ディレクトリの構造
ルートディレクトリを頂点とした階層構造になっている

:::note
一番上の **「/」** をルートディレクトリと呼ぶ
:::

### 主要なディレクトリの役割
`/bin`
一般ユーザー及び管理ユーザーの両方が使用するコマンドの実行ファイルを格納  
       特にLinuxの動作に最低限必要な重要度の高いコマンドの実行ファイルを格納
`/dev`
デバイスファイル（ハードウェアをファイルとして扱えるようにしたファイル）を格納
`/etc`
設定ファイルを格納。　Linuxで動作するアプリケーションの設定ファイルや、Linux自体の設定に関わるファイルが置かれる
`/home`
ホームディレクトリが配置される。ユーザーはホームディレクトリ内に自由にファイルやディレクトリを作成できる



### cdコマンド(change directory)
ディレクトリを移動するコマンドでLinux必須
```
書式：cd[オプション(覚えなくてOK)][ディレクトリ]
具体例：＄cd/home/*****/      
```

#### 特別なディレックトリの指定
カレントディレクトリ、親ディレクトリ、ホームディレクトリには特別な指定方法がある

| ディレクトリ | 意味 | 指定方法 |
|:-:|:-:|:-:|
|カレントディレクトリ |現在自分がいるディレクトリ   |`.`   |
|親ディレックトリ   |１つ上の階層のディレクトリ   |`..`   |
|ホームディレクトリ   |「/home/ユーザー名」ディレクトリ   |`~`   |
|ルートディレクトリ   | 「 / ]ディレクトリ   |`/`   |

:::note
シェル、ターミナルを立ち上げると自動的にホームディレクトリに入るようになる
:::

### pwd(print name of working directory)
カレントディレクトリを表示するコマンド
```
書式：pwd[オプション] オプションを打つことはほぼない
具体例：＄　pwd　(home/fukushima)
```

:::note
今いるディレクトリがわからなくなったらpwdコマンドで確認する
:::

### ls(list)
ファイルやディレクトリを表示するコマンド
```
書式：ls[オプション][ディレクトリ・ファイル名]
具体例： ls/
```

#### パス名展開とは
パス名展開を使うと複数のファイルを一度に指定できる
|記号|意味|
|:-:|:-:|
|`*`|任意の文字列|
|`?`|任意の一文字|

```
具体例
①拡張子が.HTMLのファイルの一覧を表示
$ls*.html
index.html home.html job.html

②Zから始まり４文字で終わるファイルを表示
＄ls /bin/z???
/bin/zcat,/bin/zcmp,/bin/znew 
```

::: note warn
パス名展開はシェルの機能であるため他のコマンドでも使用可能
:::

#### オプションとは
ハイフンに何かの記号を続ける形の引数をオプションという
コマンドにオプションを与えることで、コマンドの動作を変えることができる
**<書き方>**
①コマンドの後ろにスペース区切りで指定する(＄ls-a)
②2つ以上指定できる(＄ls-a-lと$ls-alは同じ意味)
③オプションとコマンドの引数を同時に指定できる(＄ls-al/)
④オプションが引数を取ることもある(＄ls-w 10)
⑤「--」で始まるロングオプションもある(＄ls --version) **長い名前をつけるときに使用する**

#### lsコマンドでよく使うオプション
| オプション | 操作 |
|:-:|:-:|
|`-l`   |ファイルの詳細情報を表示する   |
|`-a`   |隠しファイルも含めた全てのファイルを表示する   |
|`-F` |ファイル種別を表示する |

:::note 
.で始まるファイルは隠しファイルと見なされ通常は表示されない
:::

ファイルの記号
|記号|内容|
|:--:|:-:|
|/|ディレクトリ|
|@|シンボリックファイル|
|*|実行可能ファイル|
|記号なし|通常ファイル|




### mkdirコマンド(make directory)
ディレクトリを作成するコマンド
``` 
書式：mkdir[オプション]<作成するディレクトリ名>
具体例：codeディレクトリを作成する
　　　　　　　　　　$ mkdir code
     ディレクトリ名は日本語で作成すると文字化けする恐れがあるため英語で作成するのがおすすめ
```

:::note
[ ]は任意、< >は必須という意味になる
:::

#### mkdirコマンドのオプション
深いディレクトリを作成できる
`-p` 書式：$ mkdir -p test/2019/08

:::note
-pオプションを付けることでtest,2019というディレクトリを事前に作る必要なし
:::

### rmdirコマンド(remove directory)
空のディレクトリを削除するコマンドで中にファイルが残っていることに気づかずにディレックトリを削除しいてしまうのを防げる
```
書式：rmdir <ディレクトリ名>
具体例：＄　rmdir code
```

:::note
空でないディレクトリを削除しようとするとエラーになる
:::

### パスとは何か
ディレクトリやファイルの住所情報
ディレクトリの階層の区切りを「/」で表現する

#### 相対パスと絶対パス
**絶対パス**はルートディレクトリ(「/」)から始まるパス
**相対パス**はカレントディレクトリから始まるパス

:::note
使い分け
確実に指定したいとき(曖昧さをなくす)は絶対パス
ぱっと指定したい時は相対パス
:::

### 特別なディレクトリ表記
**「.」**はカレントディレクトリを表す
**「..」**は親ディレクトリを表す
表記方法
| 相対パス | 絶対パス |
|:-:|:-:|
|../..   |/   |
|..   |/home   |
|.   |/home/kume   |
|codeまたは./code   |/home/kume/code   |
|code/workまたは./code/work   |home/kume/code/README.md   |

### コマンドの使い方を調べよう
- --helpオプションをでコマンドのヘルプメッセージを表示する
```
書式：<コマンド> --help
具体例：$ls--help
 使用法：ls[オプション]...[ファイル]
```

:::note
使用方法、コマンドの概念、利用可能なオプション一覧を教えてくれるためコマンドの概念を理解したいときに使用
:::

- manコマンドでコマンドのマニュアルを表示する
```
書式：man<調べたいコマンド名>
具体例：＄ man ls
      NAME
        ls-list direstory contents
      $ man -k move #キーワードからも検索できる
```
:::note
helpオプションより詳しいためコマンドをきちんと理解したい時に使用(manの方が有用)
:::

## ファイル
### ファイルの種類
**テキストファイル**とは
- 文字コードで定められた文字だけが格納されているファイル
- 文字コードとは文字をコンピュータで処理したり通信したりするために文字の種類に数値を割り振ったもの
- Linuxではテキストファイルはとても大切。OSに関わるほとんどの設定情報をテキストファイルとして管理している

:::note
コンピュータの中では文字は特定の数値の並びで表現されている
ex)Aは１０００００１、Bは１００００１０、など
:::

**バイナリファイル**とは
画像ファイルや音声ファイル、実行ファイルのこと
- 文字コード以外の数値も含むようなファイルをバイナリファイルという
- テキスト以外のファイルをバイナリファイルと呼ぶ
- catコマンドなどでバイナリファイルが文字化けするのは、無理矢理テキストファイルとして解釈しようして、文字コードに該当した数値をその文字に置き換えてしたため意味不明の文字列になった




### catコマンド(concatenate)
ファイルの中身を表示する（いくつかあるがcatコマンドが代表的）
```
書式：cat[オプション]<ファイル名>
具体例：＄cat/etc/hosts
      127.0.0.1 localhost
      ::1  localhost6
```
  
#### catコマンドのオプション
`-n`: 行番号を表示するオプション
```
#ファイルの詳細情報を表示
＄cat-n/etc/hosts
1 127.0.0.1 localhost
2 ::1    localhost6
#複数のファイルをまとめて表示することもできる
$cat/etc//hostname /etc/hosts
local.localdomain
127.0.0.1 localhost    ←/etc/hostnameの内容
::1    localhost6　　　　　　　　　　　　←/etc/hostsの内容
```

### lessコマンド(less -opposite of more)
ファイルの中身をスクロール表示するコマンド

:::note
長いファイルはcatよりlessを使う
:::

```
書式：less[オプション]<ファイル名>
具体例：＄　less/etc/vimrc
      if v:lang=~...
```

#### スクロールの操作方法
| コマンド | 内容 |
|:-:|:-:|
|スペースキー、f|一画面下にスクロール   |
| b  |一画面上にスクロール   |
|j   |一行下にスクロール   |
|k   |一行上にスクロール   |
|q   |lessコマンドを終了   |

#### 検索の操作
特定の文字列を検索してその箇所だけをみたいときに使用
|コマンド  | 内容 |
|:-:|:-:|
|/<文字列>　|下方向に向かって検索|
|？<文字列> |上方向に向かって検索|
|n   |次の検索結果に移動|
|N   |前の検索結果に移動|

### tailコマンド
指定したファイルの末尾部分を表示するコマンド
```
書式：tail[オプション]<ファイル名>
```
**オプション**
|コマンド|内容|
|:---:|:---:|
|-n 行数, -行数|指定した行数を表示|
|-c バイト数|指定したバイト数を表示する|
|-f|ファイルの末尾に表示された行を表示し続ける|


### touchコマンド(touch)
空のファイルを作成するコマンド
　
```
書式：touch<新規ファイル名１>、<新規ファイル名２>...
具体例：$touch README.md
```
:::note
ファイル名が存在していない時は空のファイルを作成して、存在している時はタイムスタンプを更新する
間違ったファイルを指定しても上書きすることはない！
:::

### rmコマンド(remove)
ファイルを削除するコマンド
```
書式：rm[オプション]<削除するファイル名１><削除するファイル名>...
具体例：＄rm README.md
```
::: note warn
rmコマンドを実行するとゴミ箱ではなく削除されてしまうため注意
:::

#### よく使うオプション
`-r`:ディレクトリも合わせて削除する
```
$rm-r　dir　　
```
ディレクトリの中のファイルやディレクトリもまとめて削除されるため注意

`-f`:ファイルを削除する前に警告文を表示しない
```
＄rm-f file
```

`-i`:ファイルの削除前に確認する
```
$rm-i　file
```

### mvコマンド(move)
ファイルの移動、ファイル名を変更するコマンド
```
書式：mv[オプション]<移動元>...<移動先>
具体例：$ mkdir dir
      $ touch file

      #ファイル名を変更　　　
　　　　　　　　　　　　$ mv file file1

      #ファイルを移動
　　　　　　　　　　　　＄　mv file1 dir/
```

#### mvコマンドオプション
`i`：上書きする前に確認する
```
$ mv -i file file1
```

### cpコマンド(copy)
ファイルやディレクトリをコピーするコマンド
```
書式：cp[オプション]<コピー元>...<コピー先>
具体例：#　ファイルをコピー
　　　　　　　　　　　＄cd　file new_file

      #ファイルをディレクトリ内にコピーする
　　　　　　　　　　　　$cd file dir
```

:::note warn
コピー先のファイルがすでにあると上書きするので注意
:::

#### cpコマンドのオプション
`-i`：上書きをする前に確認する
```
$cp -i file new_file
```

`-r`:ディレクトリをコピーする
```
$ cp-r dir new_dir
```

### リンクを貼る　
Linuxではファイルに別名を付けることができる。このことを「リンクを貼る」という。
**ハードリンク**
- １つのファイルの実態に複数の名前をつける機能
- 元のファイルを削除しても消えない
- 全てのハードリンクがなくなった時に消える

**シンボリックリンク**
- リンク先のパス名が書かれた特殊ファイル。リンク先がファイルの実体
- シンボリックリンクを残したままファイルの実体を削除したり、ファイルの移動するとファイルを参照できなくなる

### lnコマンド（link）
リンクを貼るコマンド
```
書式：ln[オプション]<リンク元のファイル名><リンク名>
具体例：# ハードリンクを貼る
　　　　　　　　　　　　$ln file1 file2
```

 ::: note
  オプションを何もつけないとハードリンクになる
:::
#### lnコマンドのオプション
`-s`：シンボリックリンクを貼る
```
$ls -s file1 file3
```

#### リンクはどういう時に使うのか？
- 長いパス名を省略する時
- 　複数バージョンを共存させ最新を区別したい時

:::note 
シンボリックリンクの方が使うことが多い。ハードリンクはいくつか制限があって、異なるディレクトリをまたいで作成できなかったり、ディレクトリに対して使えない。シンボリックリンクは制限を受けない。
:::

### find 
ファイルを検索するコマンド
```
書式：find<検索開始ディレクトリ><検索条件><アクション>
具体例：$find.-nameREADME.md-print 
```

:::note
ファイルがどこにあるかを探すときfindコマンドを使うと便利
:::

#### よく使われる検索条件
`-name`ファイル名を指定してファイルを検索。ファイル名の大文字、小文字は区別する
```
　書式：$find.-nameREADME.md
 ワイルドカードが使える。*を使って指定する時は"で囲うこと
　　　ex)$find.-name'*.html'-print
```
       
:::note
  `*`と`?`は任意の列に一致する
:::

`-iname`:ファイル名を指定してファイルを検索。ファイル名の大文字、小文字は区別しない。
```
　　　　　書式：＄find.-iname readme.md
```

`-type`:ファイルの種類で検索
```
　　# -type fは通常のファイル
　　$find.-type f -print

 #-type lはシンボリックリンク
　　$find.-type l -print

 #-type dはディレクトリ
　　$find.-type d -print
```
`-a`:複数の検索条件を指定。`-a`は省略可能
```
　　書式：$find. -type d -a -name images -print
```



### chmod(change mode)
ファイルやディレクトリのパーミッションを設定する
```
書式：chmod[ugoa][+-=][rwx]<ファイル名>
具体例：$chmod u+r file
```
**詳細**
|記号|内容|
|:--:|:--:|
|u|所有者の権限|
|g|グループの権限|
|o|その他のユーザーの権限|
|a|全ユーザーの権限|
|+|権限を追加|
|-|権限を削除|
|=|既述した権限にする|

**chmodコマンドを数値で指定する方法**
```
書式：chmod<８進数の数値><ファイル名>
具体例：＄chmod 755 file
```
**詳細**
|パーミッション|数値|
|:--------:|:--:|
|r(読み取り)|４|
|w(書き込み)|２|
|x(実行)|１|

:::note
数値で置き換えてその数字を足し合わせる
:::
通常の指定は**相対指定**、数値指定は**絶対指定**の書き方となる

## プロセス
実行中のプログラムのことを**プロセス**という

:::note
コマンドを実行すると、実行ファイルをメモリに格納して、メモリ上でCPUがプログラムを実行する。一つ実行すると新しいプロセスが一つ作られる
:::

### chownコマンド
ファイルやディレクトの所有者を変更するコマンド
chownコマンドは管理者ユーザー権限で行われないと、権限なしで操作できない場合があるため管理者権限のアカウントで操作する
```
書式：$ chown 所有者名 ファイル名またはディレクトリ名
```
#### chownコマンドのオプション
|オプション|内容|
|:----:|:---:|
|-c|変更があった場合に、メッセージを表示する|
|-v|コマンドの実行状況を表示|
|-f|エラーメッセージを表示しない|
|-h|シンボリックリンク自体の所有者を変更する|
|-R|ディレクトリ内の所有者も変更する|

**-R**はよく使われる

### psコマンド(process status)
```
書式：ps[オプション]
具体例：$ps
      PDI TTY TIME CMD
      3935 pts/0   00:00:00 ps
     20961 pts/0   00:00:00 bash
```

:::note
一行ずつが一つのプロセス
PIDにプロセスIDが、CMDに実行中のコマンドが表示されている
:::

#### psコマンドのオプション
`aux`:全ユーザーのプロセスを詳細情報を併せて表示
　```
$ps aux
```
-はつけなくてOK
xがpsコマンドを実行したユーザーの全てのプロセス
aが全てのユーザーのプロセス
uが詳細情報を合わせて表示する
```
## ジョブ
まとめて実行されるプロセスの集まり。シェルごとに管理される。
```
プロセスは３つ生成される
$ps aux|grep bash|less
ジョブは1つ生成される
```
**ジョブとプロセスの違い**
- プロセスはOS全体で統一して管理される。システムが自動で実行しているプログラムや他のユーザーが実行しているコマンドを一括して管理
- ジョブはそのジョブを実行するシェルで管理される

## バックグラウンドとフォアグラウンド
シェルの画面外でコマンドを実行することを**バックグラウンド**
シェルの画面内で実行することを**フォアグラウンド**

### jobsコマンド(jobs)
現在のジョブの一覧を表示するコマンド
```
書式：$ jobs
具体例：$jobs
      [1]+ 実行中　sleep 10&
      ジョブID、実行状況、実行コマンドを表示
```

### fgコマンド(foreground)
ジョブをフォアグラウンドにするコマンド
```
書式：fg%<ジョブID>
具体例：$fg%1
```
:::note
ジョブをフォアグラウンドに戻して対話的に操作したいときに使う
:::

### bgコマンド(background)
ジョブをバックグラウンドにするコマンド
```
書式：bg%<ジョブID>
具体例：$bg%1
```
:::note
長い時間がかかる処理をバックグラウンドを実行することでコマンドが終了するのを待たなくてもいい
:::

### killコマンド(kill process)
ジョブやプロセスを終了させるコマンド
```
書式：kill[オプション]%<ジョブID>
    kill[オプション]<プロセスID>
具体例：$kill %1
      $kill 4965
```
:::note
フォアグラウンドのジョブはctrl+cで終了できる
停止中やバックグラウンドのジョブはkillコマンドで終了できる
:::

#### killコマンドの補足
- 正確にはシグナルを送信するコマンド
```
$kill-<シグナル名><プロセスID>
```
- デフォルトではTERMという終了を指示するシグナルを送信している
```
#この２つのコマンドは同じ
$kill 4965
$kill -TERM 4965
```
- SIGKILLという強制終了のシグナルを時々使う(最終手段)
```
$kill-SIGKILL 4965
$kill -9 4965
```

## さいごに
今回はUdemyでLinuxを学びました。Linuxの勉強をしたいけど何をしたらいいのか分からない方はぜひ以下の動画を視聴してみてください。
[Udemy](https://www.udemy.com/course/unscared_linux/)
「もう怖くないLinuxコマンド。手を動かしながらLinuxコマンドラインを5日間で身に付けよう」
作成者：山浦　清透