#Linux shellコマンド概要図鑑

##基礎を知ろう
「教えられるまま、ターミナルやコマンドを使っていたけどそもそも、何ができるの？
基礎を知れば、作業がもっとできることが広がるのでは…？」

という事で、ターミナルとは？
どんなコマンドがあって何が出来るの？
拙いながらに、調べて結果を議事録に残しています。

🔍ボリュームがあるので、概要を簡単に

**ということで、いざ本題へ！🚪**

対象者：初心者・コマンド怖い・どんなコマンドあるのか概要を知りたい人
環境：Windows10・Linux・Visual Studio Code

---

##もくじ

1. [ターミナル](#ターミナル)
2. [デイレクトリ](#ディレクトリ)
3. [ssh](#ssh)
4. [たぶん、よく使うコマンド](#たぶんよく使うコマンド)
5. [このコマンド、どこで使う？](#このコマンドどこで使う)
6. [番外編：シェルスクリプト~作成から実行~](#番外編シェルスクリプト作成から実行)



##本題
####ターミナル
https://www.sejuku.net/blog/4202
  特別な文字（コマンド）にてパソコンの設定や操作を行う場所

- **ターミナルショートカットキー**
<br> http://doi-t.hatenablog.com/entry/2015/03/28/011926
<br> `例：Ctrl + c　コマンドの強制終了`


####ディレクトリ
- **pass**
  <br> ファイルやフォルダ（ディレクトリ）が存在する場所
  <br> `例：C:\Users\OWNER`
  - **カレントディレクトリ**
  <br> 自分が今いるディレクトリ（フォルダ）
  <br> 例：git-repositoryファイルにいるとき 
👉 `C:\Users\OWNER\git-repository`
- **pwd**
<br> https://eng-entrance.com/linux-command-pwd
<br> 今、どの階層にいるのか（カレントディレクトリ）を表示する
<br> `例：/home/vagrant/bootcamp`

### <a id="ssh">ssh</a>
別のコンピューターを遠隔で操作する際、送信するファイルなどのデータが他者に読まれぬよう、暗号化する仕組み

- sshの作成から設定まで
<br> https://blog.masahiko.info/entry/2019/06/15/202003
  <br> $ssh-keygeにてssh keyを発行し、仮想環境（別のコンピューターで遠隔操作）への接続を行う
  <br> **👀 リンクはwindowsのsshの設定です**


###たぶん、よく使うコマンド

- **cd**
https://eng-entrance.com/linux-command-cd
作業するディレクトリを移動するときのコマンド
`例：cd 移動したいディレクトリ・ファイル名`
<br> **👀 cdでerror発生した！違う階層にいる可能性が高い…。**
  1. `cd test` 👉 自分がいる階層にtest.txtファイルあるか？
  2. lsで今の階層には何があるのか確認する
  3. 目的のファイルがある階層まで移動する
     <br> または、
     <br> cdコマンドで一気にディレクトリを移動しながらファイルへ飛ぶ
     <br> `cd ディレクトリ1/ディレクトリ2/test`
 
- **ls**
  https://www.atmarkit.co.jp/ait/articles/1606/27/news018.html
  ファイルの一覧や詳細情報を表示する
  `例：ls`

- **ls -la**
  頭にドットがついたファイル（隠しファイル）を含めたすべてのファイルの一覧と、権限やタイムスタンプなど詳細情報を表示す
  `例：ls -la`

```shell:コマンド実行例
例：drwxrwxr-x  4 vagrant vagrant 4096  5月  4 18:57 .
  drwxr-xr-x 11 vagrant vagrant 4096  5月  3 16:17 ..
  drwxrwxr-x  8 vagrant vagrant 4096  5月  4 18:56 .git
  -rw-rw-r--  1 vagrant vagrant   26  5月  4 18:56 README.md
  -rw-rw-r--  1 vagrant vagrant  866  5月  4 18:58 sheet_shell.md
  drwxrwxr-x  2 vagrant vagrant 4096  5月  4 18:57 shell
```

- **mkdir**
  https://eng-entrance.com/linux-command-mkdir
  mkdir：make directory
  ディレクトリ（フォルダ）の新規作成を行う
  `例：mkdir ディレクトリ名`

- **touch**
  https://eng-entrance.com/linux-command-touch
  ファイルの新規作成を行う
  `例：touch ファイル名.拡張子(txt・log・rb...)`

- **rm**
  https://eng-entrance.com/linux_command_rm
  rm：remove
  ファイルやディレクトリ（フォルダ）を削除する
  `例：rm ディレクトリ1/ディレクトリ2/ディレクトリ・ファイル名`
  👀同じディレクトリにファイルがあるとき：`rm text.txt`

- **mv**
  https://eng-entrance.com/linux_command_mv
  mv：move
  ファイルやディレクトリ（フォルダ）の場所移動や名前の変更を行う
  `例：mv test.txt folder/test.txt`
  👉 test.txt が folderディレクトリ の test.txt へ

- **パイプ**
  https://qiita.com/b4b4r07/items/77c589f21a99db8bb682
  配管みたいにコマンドを接続していくもの
  `例：コマンド1 | コマンド2`
  👉 コマンド1の結果をコマンド2が受け取り2つのコマンドを実行する

---
###このコマンド、どこで使う？
ここからは、よく聞くけど、使い方がいまいちわからないコマンドを軽く紹介。

- **ps**
  <br> https://eng-entrance.com/linux-command-ps
  <br> linux上で今動いている**プロセス**を一覧表示する
  <br>  　 **プロセス**：実行中のプログラム
  <br>  　 　 https://eng-entrance.com/linux-process
  <br> `例：ps`

  ***---どう使う？---***
  `ps aux`
  　　自分以外の実行中プロセスを含めた全てのプロセス一覧を確認
  　　実行の妨げになるプロセスを見つける

  ***---使用オプション---***

```
  a：ほかのユーザーの端末操作プロセスの表示
  u：ユーザー名・開始時刻・UPU・メモリの使用率などを表示
  x：いま実行しているプロセスを表示
```

- **top**
  <br> https://www.atmarkit.co.jp/ait/articles/1706/30/news018.html
  <br> 現在実行中のプロセスをCPUの利用率が高い順番で表示
  <br> 表示内容はリアルタイム更新
  <br> `例：top オプション`

  ***---どう使う？---***
  `top -u ユーザー名`
　　指定したユーザーのプロセス状況を確認する
  `top -p プロセスID`
　　指定したプロセスの状況を確認する
  `top -d 更新間隔の秒数`
　　指定した秒数の感覚でtopの内容を更新する

  ***---使用オプション---***

```
  -u：表示するユーザーを名またはIDにて指定
  -p：表示するプロセスをIDにて指定
  -d：表示更新の感覚を秒数指定
```

- **grep**
  <br> https://26gram.com/linux-grep-command
  <br> 指定した文字列が含まれる行の検索
  <br> `例：grep 検索パターン ファイル名`

  ***---どう使う？---***
  `grep "指定ワード" file_A.txt file_B.txt file_C.txt`
　　複数のファイルの中から指定ワードを検索する
  `grep "指定ワード" directoryA/fileA.txt`
　　他のディレクトリのファイルから指定ワードを検索
  `コマンド | grep 指定ワード`
　　最初のコマンドの結果から指定検索パターンで検索
　　例：ls -l | grep 指定ワード
   　👉 今のディレクトリにあるファイルを一覧表示、
　　表示したファイルから指定したワードが含まれるファイル名を表示
　　
  ***---使用オプション---***

```
  -l：検索結果にファイル名のみ表示
```

- **tail**
  <br> https://26gram.com/linux-tail-command
  <br> ファイルの末尾内容を表示（デフォルトは10行分）
  <br> `例：tail ファイル名`

  ***---どう使う？---***
  `tail directoryA/file_A.txt`
　　他のディレクトリのファイルから末尾内容を表示
  `tail file_A.txt file_B.txt file_C.txt`
　　複数のファイルの末尾内容をまとめて表示
  `tail *.txt`
　　ファイル名に.txtが含まれるファイルの末尾内容をまとめて表示
  `tails -f fileA.txt`
　　ログファイルのように、末尾に情報が追記されるファイルの内容をリアルタイムで監視
  `tail -n 5 fileA.txt`
　　ファイルの末尾内容5行のみ表示
　　 省略：fail -5 fileA.txt
👀リアルタイム更新を終了：`Ctrl+C`

  ***---使用オプション---***

```
-f：ファイルの内容を監視し、表示結果をリアルタイムで更新
-n：出力する行数を指定
```

- **find**
  <br> https://26gram.com/linux-find-command
  <br> ファイルやディレクトリ（フォルダ）を検索
  <br> `例：find 検索対象 検索条件`
	
  ***---どう使う？---***
\*(ワイルドカード)を使用したファイル名の指定をすると、キーワードの場所を指定(前とか後とか)
`例：find . -name "shell*"`
　　先頭にshellを含むファイルをカレントディレクトリから検索
`find ディレクトリ名 -name　検索ワード`
　　指定したディレクトリ内でファイルを検索
　　指定したワードの大文字・小文字を区別して検索
　　　　区別しない場合：-iname
`find ディレクトリ名 -name 検索ワード -type d`
　　指定したディレクトリ内でディレクトリを検索
`find file_A.txt file_B.txt file_C.txt (-type f)`
　　複数のファイルを検索する
`find ./ -name "*.sh" -exec chmod 755 {} \;`
　　.shがつくファイル全ての権限を755に変更
` find ディレクトリ名 -empty`
　　指定したディレクトリ内で、空のファイル・ディレクトリを表示
` find ディレクトリ名 -ls`
　　指定したディレクトリ内のファイル情報を表示

  ***---使用オプション---***

```
-empty：サイズ０ファイル、空のディレクトリを検索
-exec：検索結果のファイルに指定したコマンドを実行
-ls：検索結果のファイルの情報を表示
-name：ファイルやディレクトリ名を指定し大文字・小文字を区別して検索
　　-iname：ファイルやディレクトリ名を指定し大文字・小文字を区別せず検索
-type：指定したファイル種類に一致するファイルやディレクトリを検索
　　-type f：ファイル
　　-type d：ディレクトリ
```

- **chmod**
<br> https://eng-entrance.com/linux-command-chmod
<br> ファイルやフォルダのアクセス権権限（パーミッション）を設定
<br> パーミッションは実行・書き込み変更・読み込みの設定が出来る
<br> 例：`chmod パーミッション番号 ファイル名`

```
 7　rwx	読み書き実行可
 6　rw-	読み書き可
 5　r-x	読み　　実行可
 4　r--	読み可
 3　-wx　　書き実行可
 2　-w-	書き可
 1　--x	実行可
 0　	---	なし
```

  ***---どう使う？---***
`chmod -v 755(仮) file_A.txt | ls -la`
　　指定したファイルのアクセス権限を変更し、確認する
`chmod ユーザー 追加解除 アクセス権限 file_A.txt`

```
ユーザー：
　　所有者　u
　　グループ　g
　　その他ユーザー　o
　　すべてのユーザー　a
追加解除：
　　追加　+
　　解除　-
アクセス権限：
　　実行許可　x
　　書き込み許可　w
　　読み取り許可　r
```

  ***---使用オプション---***

```
-v：コマンド実行の結果を表示
```

- **chown**
<br> https://eng-entrance.com/linux-command-chown
<br> ファイルやディレクトリの所有者を変更
<br> `例：chown 所有者　ファイル名（ディレクトリ名）`

  ***---どう使う？---***
`chown -R 所有者名 ./`
　　カレントディレクトリ下、すべてのファイルやディレクトリの所有者を変更

  ***---使用オプション---***

```
　　-R：ディレクトリ内の所有者を変更
```
- **&&**
<br> https://eng-entrance.com/linux-basic-and
<br> 複数のコマンドを実行（AND制御演算子）
<br> 👀；と&&の違い：&&はコマンド１が成功したらコマンド２を実行する
<br> 例：`toush test.txt && ls -la test.txt`

  ***---どう使う？---***
　　複数のコマンド実行したいとき
　　コマンド1が成功した後にコマンド２を実行させたいとき	  

##番外編：シェルスクリプト~作成から実行~
- **シェルスクリプトファイルを実行する際の事前準備**
<br> 👀作成した.shファイルには、
<br>**ファイル内のスクリプトを実行するための権限がない**ため、権限を与える必要がある

```
  $ touch test.sh  <!-- ファイルの作成 -->
  $ chmod 755 test.sh  <!-- ファイルの権限変更 -->
  $ ./test.sh  <!-- ファイルの実行 -->

```
<br> **省略系**：作成と権限変更をまとめて実行：`touch test.sh && chmod 755 test.sh`

##参考サイト

- [初心者向けシェルスクリプトの基本コマンドの紹介](https://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337#%E3%82%AA%E3%83%9A%E3%83%AC%E3%83%BC%E3%82%BF)
- [【Linuxコマンド入門】初心者が勉強すべき Linuxコマンド一覧](https://26gram.com/linux-command)