Linuxのコマンドについて学んでみた！

## はじめに　
IT未経験者がLinuxの基礎コマンドを理解するためにブログを執筆致します。
また、本記事は以下の教材を元にインプット致しました。

参照：https://www.udemy.com/course/unscared_linux/?couponCode=24T5MT071025
　　　https://linuc.org/textbooks/linux/

## Linuxの基礎知識　
Linuxを勉強するにあたり、習得すべき基礎知識を掲載いたします。

#### Linuxはファイルからできている
Linuxで扱う情報（データ）は「ファイル」として扱われる。システム全体も１つ１つのファイルとして構成されている。ハードディスク、キーボードといった入力装置はそれぞれファイルが割り当てられており、そのファイルを介して機器を操作することもできる。Linxでは全てがファイルとして表現されている。

#### ディレクトリ
ファイルを整理する入れ物のこと
windowsやmacOsでいうフォルダのこと。

#### コマンドライン引数（ひきすう）
コマンドの後ろにスペース区切りで指定する文字列のこと
```ruby:具体例
cd /user
```
#### オプション
コマンドの動作を変える事ができる。
ハイフンに何かの記号を続ける引数のこと
```ruby:コマンドの後ろにスペース区切りで指定
$ ls -a
```
```ruby:2つ以上指定
$ ls -a -l
$ ls -al
```
```ruby:オプションとコマンドの引数を同時に指定
$ ls -al /
```
______

## cd  

cdコマンド：ディレクトリを移動するコマンド
略称：chage directory
書式：`cd ［オプション］［ディレクトリ］`

```ruby:具体例
cd /home/gushiken
```
| ディレクトリ | 意味 | 指定方法　　　 |
|:-----------:|:-----------:|:-----------:|
|カレントディレクトリ|  現在自分がいるディレクトリ       | 「.」 |
| 親ディレクトリ     |  一つ上の階層のディレクトリ      | 「..」      |
| ホームディレクトリ　　　　| /home/ユーザー名　ユーザーが自由に使えるディレクトリ | 「~」　|
| ルートディレクトリ  | 一番上のディレクトリ　ルートディレクトリを頂点とした階層構造         |  「/」         |

## pwd  
pwdコマンド：カレントディレクトリを表示するコマンド
略称：print name of working directory 
書式：`pwd ［オプション］`

```ruby:具体例
pwd/home/gushiken
```
今いるディレクトリがわからなくなったら、pwdコマンドで確認していこう！

## ls  
lsコマンド：ファイルやディレクトリの一覧を表示するコマンド
略称：list 
書式：`pwd　［オプション］　［ディレクトリ・ファイル名］`

```ruby:ディレクトリを引数にしてlsコマンドを実行
$ ls/
bin/dev/home
```
```ruby:複数のディレクトリを引数にしてlsコマンドを実行
$ ls/ /user
/:
bin/dev/home
```
#### 各種オプション

`-l : ファイルの詳細情報を表示する。`
```ruby:具体例
$ ls -l
drwxr-xr-x 2 user staff 64 2 5 12:37 hosts
```
`-a : 隠しファイルも含めた全てのファイルを表示する。`
```ruby:具体例
$ ls -a
.bashrc
```
.で始まるファイルは隠しファイルとみなして通常は表示されない。

`-F : ファイル種別を表示する`
```ruby:具体例
$ ls -F
.bin@ dev/ home/
```
/はディレクトリ、@はシンボリックリンク、*は実行可能ファイル、記号なしは通常ファイルを指す。

## mkdir  
mkdirコマンド：ディレクトリを作成するコマンド
略称：make directory 
書式：`mkdir　［オプション］　<作成するディレクトリ名>`

```ruby:okinawaディレクトリを作成する
$ mkdir okinawa
```
#### 各種オプション

`-p : 深いディレクトリを一度に作成する`
```ruby:具体例
$ mkdir -p okinawa / ishigaki
```
-pオプションをつけるとokinawa、ishigakiというディレクトリを作らなくて良い！

## rmdir
rmdirコマンド：空のディレクトリを削除するコマンド
略称：remove directory 
書式：`rmdir <ディレクトリ名>`
```ruby:具体例
$ rmdir okinawa
```
空でないディレクトリを削除しようとするとエラーになる。ファイルが残っていることに気付かずにディレクトリを削除する事故が防げる。

## cat
catコマンド：ファイルの中身を表示するコマンド
略称：concatenate
書式：`cat　［オプション］　<ファイル名>`
```ruby:fileにokinawaと書かれているとする。
$ cat file
  okinawa
```

```ruby:複数のファイルをまとめて表示することもできる
$ cat file1 file2  
  okinawa
  ishigaki
```
#### 各種オプション

`-n : 行番号を表示する`

```ruby:具体例
$ cat -n file1 file2  
 1 okinawa
 2 ishigaki
```

## less
lessコマンド：ファイルの中身をスクロール表示するコマンド
略称：less-opposite of more
書式：`less　［オプション］　<ファイル名>`
```ruby:具体例
$ less/etc/bashrc
```
長いファイルの中身を見たい時に便利である。

#### スクロールの操作 :　vimと同様、検索も基本的に同じ 


| コマンド |効果 |
|:----:|:----:|
| k        | 上に移動| 
| j        | 下に移動      | 
| スペースキー、f        | 1画面下にスクロール      | 
| b        | 1画面上にスクロール      |
| q      |lessコマンドを終了|
|/検索名　| 上方向から検索した単語に移動 |  
|?検索名 | 下方向から検索した単語に移動 |
|   n   |   次の検索結果に移動 |
|  N   |   前の検索結果に移動 |

## tail
tailコマンド：指定したファイルの末尾部分を表示するコマンド　デフォルトでは、末尾の10行を表示する。
略称：tail
書式：`tail　［オプション］　<ファイル名>`
```ruby:末尾の10行を表示
$ tail okinawa file
　割愛
```
#### オプション

`-n : 末尾の5行を表示する`
```ruby:具体例
$ tail -n 5 okinawa file
  割愛
```
## touch
touchコマンド：空のファイルを作成するコマンド
略称：touch
書式：`touch <ファイル名1>　<ファイル名2>`
```ruby:具体例
$ touch okinawa.md
```
ファイル名が存在していないときは、空のファイルを作成する
存在する時は、タイムスタンプ（日時）を更新する。
touchコマンドでのファイル作成は間違って既存のファイル名を指定しても、内容が上書きされたり削除されたりしないため安全である。

## rm
rmコマンド：ファイル・ディレクトリを削除するコマンド
略称：remove
書式：`rm　［オプション］ <削除するファイル名1> <削除するファイル名2>`
```ruby:具体例
$ rm okinawa
```
rmコマンドを実行すると、ゴミ箱ではなく本当に削除されるので注意が必要である。

#### オプション

`-r : ディレクトリも合わせて削除`
```ruby:具体例
$ rm -r dir
```
ディレクトリの中のファイルやディレクトリもまとめて削除されるので注意が必要である。

`-f : ファイル削除時に警告文を表示しない`
```ruby:具体例
$ rm -f file
```

`-i : ファイル削除時に確認をする`
```ruby:具体例
$ rm -i file
```

## mv
mvコマンド：ファイルの移動、ファイル名を変更するコマンド
略称：move
書式：`mv　［オプション］ <移動元> <移動先>`
```ruby:具体例
$ mkdir dir
$ touch file

#ファイル名を変更
$ mv file file1
#ファイルを移動
$ mv file dir1
```
#### オプション

`-i : 上書きする前に確認する`
```ruby:具体例
$ mv -i Okinawa Okinawa1
```

## cp
cpコマンド：ファイル・ディレクトリをコピーするコマンド
略称：copy
書式：`cp　［オプション］ <コピー元> <コピー先>`
```ruby:具体例
#ファイルをコピー
$ cp file newfile
#ファイルをディレクトリ内にコピー
$ mv file dir
```

:::note warn
警告
ディレクトリをコピー先に指定する時に注意
コピー先のディレクトリ内にあるファイルがすでにあると上書きされるので注意が必要である。
:::


#### オプション

`-i : 上書きする前に確認する`
```ruby:具体例
$ cp -i file new_file
```

`-r : ディレクトリをコピー`
```ruby:具体例
$ cp -r dir new_dir
```
-----
## 各種詳細情報

lnコマンドをまとめる前に必要な詳細情報を記載致します。
#### リンクを貼る

Linuxではファイルに別名をつける事ができ、別名をつけることを指す。

#### ハードリンク

1つのファイルの実体に複数の名前をつける機能　ハードリンクで追加したファイル名はどちらが本物or仮という区別はない。　どちらも本物の名前である。　元のファイルを削除しても消えない　全てのハードリンクがなくなった時に削除される。

#### シンボリックリンク
リンク先のパス名が書かれた小さな特殊ファイル　リンク先がファイルの実体であり、本物のファイル　windowsのショートカットのようなもの。　シンボリックリンクを残したまま、ファイルの実体を削除したりファイルを移動すると、ファイルを参照できなくなる。

## ln
lnコマンド：リンク張るコマンド
略称：link
書式：`ln　［オプション］ <リンク元ファイル> <リンク名>`
```ruby:具体例
#ハードリンクを張る
$ ln file1 file2
#シンボリックリンクを張る
$ ln -s file1 file2
```
`リンクはどういう時につかうのか？`
長いパス名を省略したい時や
複数バージョンを共存させ最新を区別したい時につかう！

## find
findコマンド：ファイルを検索するコマンド
略称：find
書式：`find <検索開始ディレクトリ> <検索条件> <アクション>`
```ruby:具体例
$ find .-name README.md -print
       ↑　　　　　↑　　　　　 ↑
　　検索開始    検索条件　検索アクション
　 ディレクトリ
```
ファイルがどこにあるか探す時に使うと便利である。

#### オプション
`-name : ファイル名を指定してファイルを検索 ファイル名の大文字小文字は区別する`
```ruby:具体例
$ find . -name README.md
# ワイルドカードが使える　※を使って指定する時は''で囲うこと
$ find . -name '※.html' -print
```

`-iname : ファイル名を指定してファイルを検索 ファイル名の大文字小文字は区別しない`
```ruby:具体例
$ find . -iname readme.md
```
`-type : ファイルの種類で検索`
```ruby:具体例
#-type fは通常ファイル
$ find . -type f -print
#-type lはシンボリックリンク
$ find . -type l -print
#-type dはディレクトリ
$ find . -type d -print
```

`-a : 複数の検索条件を指定　-aは省略可能`
```ruby:具体例
$ find . -type d -a -name images -print
```

## chmod
chmodコマンド：ファイルやディレクトリのパーミッションを設定する。
パーミッション：ファイルやディレクトリを「誰がどのように操作できるか」を定めたのがパーミッション　-:通常ファイル、l:シンボリックリンク、d:ディレクトリ
```
-rwxr-xr-x
↑　↑  ↑  ↑
-:ファイルタイプ、rwx:オーナーのパーミッション、r-x:グループのパーミッション、
r-x:その他のパーミッション
 ```
略称：change mode
書式：`chmod［ugoa］［+-=］［rwx］ <ファイル名>`
| 記号 |内容 |
|:----:|:----:|
| u        | 所有者の権限| 
| g        | グループの権限      | 
| o       | その他のユーザーの権限      | 
| a        | 全ユーザーの権限      |
| +      |権限を追加|
| -　| 権限を削除 |  
| = | 記述した権限にする |
| r      |読み取り|
| w　| 書き込み |  
| x | 実行 |

```ruby:具体例
#ファイルに対して所有者に対して読み取りの権限を追加
$ chmod u+r file
```

#### chmodコマンドは数値で指定する場合もある
書式：`chmod　<8進数の数値>　<ファイル名>`
| パーミッション |数値 |オーナー |グループ |その他 |
|:----:|:----:|:----:|:----:|:----:|
| r(読み取り） |4 |rwx |r-x |r-x |
| w(書き込み） |2 |421 |41 |41 |
| x(実行） |1 |7|5 |5 |

```ruby:具体例
$ chmod 755 file
```
オーナー、グループ、その他の権限を数値で指定
通常の指定は相対指定、数値指定は絶対指定という。

## chown
chownコマンド：ファイルやディレクトリの所有者を変更するコマンド
補足：chownコマンドは、管理者ユーザー権限で行われないと権限なしで操作できない場合がある。sudoコマンドで管理者ユーザ権限に変更する必要がある。
略称：change owner
書式：`chown ［オプション］［ユーザー名］［:［グループ］］［ファイル］`
```ruby:具体例
#sudoコマンドを使って、オーナーをgushikenに変更する
$ sudo chown gusiken file
drwxr-xr-x 3hogehoge user 98 2 11:54 dir1
-rw-r--r-- 1gushiken user 96 5 12:53 file
#グループをokinawaに変更する
$ sudo chown :okinawa file
drwxr-xr-x 3hogehoge user 98 2 11:54 dir1
-rw-r--r-- 1gushiken okinawa 96 5 12:53 file
```

#### オプション
`-c : 変更があった時にエラーメッセージを表示する`
```ruby:具体例
$ chown -c gushiken file
```

## ps
psコマンド：実行中のプロセスを表示するコマンド
プロセス：実行中のプログラムのこと。コマンドを実行すると実行ファイルをメモリに格納してメモリ上でCPUがプログラムを実行する。プロセスは、同一のコマンドから実行されていても、それぞれ別個のメモリ領域をもつ
略称：process status 
書式：`ps ［オプション］`
```ruby:具体例
$ ps
PID  TTY   TIME     CMD
3935 pts/0 00:00:00 ps
2029 pts/0 00:00:00 bash
```
PID:プロセスID CMD:実行中のコマンド

#### オプション
`aux : 全ユーザのプロセスを詳細情報を合わせて表示する`
```ruby:具体例
$ ps aux 
  割愛
```
オプションだが`-`をつけなくて良い
| 記号 |内容|
|:----:|:----:|
| x |psコマンドを実行したユーザーの全てのプロセス |
| a |全てのユーザーのプロセス |
| u |詳細情報を合わせて表示する|
-------
#### ジョブとは
ジョブコマンドを説明する前にジョブについて解説致します。
まとめて実行されるプロセスの集まりがジョブ、シェルごとに管理されます。

`ジョブとプロセスの違い`

ジョブ：そのジョブを実行するシェルで管理されます。
プロセス：プロセスはOS全体で統一して管理される。システムが自動で実行しているプログラムや他のユーザーが実行しているコマンドを一括して管理している。

## jobs
jobsコマンド：現在のジョブの一覧を表示するコマンド
略称：jobs
書式：`jobs`
```ruby:具体例
jobs
［ 1 ］　+ 実行中　sleep 100 &
```
ジョブID、実行状況、実行コマンドを表示する

## fgコマンド
fgコマンド：ジョブをフォアグラウンドにするコマンド
略称：foreground
書式：`fg %<ジョブID>`
```ruby:具体例
$ fg %1
```

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

## killコマンド
killコマンド：ジョブやプロセスを終了させるコマンド（シグナルを送信するコマンド）
略称：kill process
書式：`kill ［オプション］ %<ジョブID>`
     　　　`kill ［オプション］ %<プロセスID>`
```ruby:具体例
$ kill %1
$ kill 4965
```
フォアグラウンドのジョブはCtrl+cで終了できる
停止中やバックグラウンドのジョブはkillコマンドで終了できる。

#### 補足

```ruby:具体例
#デフォルトでは、TERMという終了を指示するシグナルを送信している。この2つのコマンドは同じ
$ kill 4965
$ kill -TERM 4965
```
#### 時々使うシグナル

```ruby:具体例
#強制終了のシグナル　SIGKILL この2つのコマンドは同じ
$ kill -SIGKILL 4965
$ kill -9 4965
```

## まとめ
はじめてLinuxについて学んだ。Udemyの動画や標準教科書が読みやすくて勉強自体も楽しめた。
Linuxは必須の技術であり、ここでがっつり学べたので自分の血肉となった。
コマンドは打ち込むことではじめて使えるようになるので実践あるのみだと感じた。
これからも、コツコツ勉強を継続していこうと思います。