Linux操作 基本 

Linuxコマンドをいちいち調べるのが面倒なため自分用にメモ

## ディレクトリ操作

### カレントディレクトリの確認
```shell-session: cmd
$ pwd
/home/ubuntu
```

### ディレクトリの確認
#### - オプション無し
```shell-session: cmd
$ ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
```


#### - オプション有り(詳細表示)

```shell-session: cmd
$ ls -l
drwxr-xr-x 2 root root 4096 Feb  2 10:29 dir1
drwxr-xr-x 2 root root 4096 Feb  2 10:34 dir2
-rw-r--r-- 1 root root    0 Feb  2 10:29 file1
```
##### ls表示内容見方
| 左から | 説明 |
|:-----------|:------------|
| d  | ディレクトリ(ファイルの場合は「-」、シンボリックリンクの場合は「l」)|
| rwxr  | アクセス権|
| 2  | ディレクトリはファイル数、ファイルはハードリンク数|
| root |所有者|
| root |所有グループ|
| 4096 |サイズ|
| Feb  2 10:29 |最終更新日時|
| dir1 |ファイル名、フォルダ名|

#### - オプション有り(隠しファイル表示)
```shell-session: cmd
$ ls -a
.  ..  ubuntu
```

#### - オプション有り(隠しファイル&詳細表示)
```shell-session: cmd
$ ls -al
drwxr-xr-x 3 root   root   4096 Dec 13 02:14 .
drwxr-xr-x 1 root   root   4096 Jan 12 11:18 ..
drwxr-x--- 2 ubuntu ubuntu 4096 Dec 13 02:14 ubuntu
```

### 作成
#### - 指定したディレクトリの作成

```shell-session: cmd
$ mkdir dirName
+ dirName
```
:::note warn
注意
複数階層のディレクトリは作成できない
:::

#### - 複数階層ディレクトリの作成
```shell-session: cmd
$ mkdir -p dirName/dirName2/dirName3
+ dirName
+ dirName/dirName2
+ dirName/dirName2/dirName3
```

### 削除
#### - 空のディレクトリ削除
```shell-session: cmd
$ rmdir dirName
- dirName
```
:::note warn
注意
ディレクトリの中が空で無い場合は削除できない
:::

### コピー
コピーコマンドに「-r」オプションを付けてる
```shell-session: cmd
$ cp -r fromDirName copyDirName
+ copyDirName
```

## ディレクトリ移動

### 指定して移動
#### - 絶対パス
```shell-session: cmd
$ cd /home/ubuntu
```

#### - 相対パス
```shell-session: cmd
$ cd ./home/ubuntu
$ cd home/ubuntu
```

### ホームディレクトリに移動
複数のコマンドで移動が可能
一つ目と二つ目が一般的？
```shell-session: cmd
$ cd
$ cd ~
$ cd /home/ユーザー名
```

### 一つ前のカレントディレクトリに移動
```shell-session: cmd
$ cd -
```

## ファイル操作
### 作成

```shell-session: cmd
$ touch newFile
+ newFile
```
:::note info
補足
ファイルが存在する場合はタイムスタンプが更新される
:::

### 作成(ブレース展開)

#### - 複数指定して作成
「,」で区切って指定を行う
```shell-session: cmd
$ touch newFile{1,3}
+ newFile1
+ newFile3
```

#### - 範囲指定して作成
「..」で範囲して行う
```shell-session: cmd
$ touch newFile{1..4}
+ newFile1
+ newFile2
+ newFile3
+ newFile4
```

### 削除

```shell-session: cmd
$ rm delFile
- delFile
```
:::note warn
注意
ハードリンクが複数ある場合はハードリンクのみ削除される
:::

### 削除(パス名展開)
```shell-session: cmd
$ ls
file1 file2 file3 file4

$ rm file*
- file1
- file2
- file3
- file4
```

### コピー
```shell-session: cmd
$ cp コピー対象 コピー後ファイル名(または格納ディレクトリ)
+ copyFileName

$ cp copyFrom.txt copyTo.txt
```

### ファイル名変更
```shell-session: cmd
$ mv 対象ファイル名 変更後ファイル名
対象ファイル名 → 変更後ファイル名
```

### 格納ディレクトリ移動
```shell-session: cmd
$ mv 対象ファイル 移動先ディレクトリ
- 対象ファイル
+ 移動先ディレクトリ/対象ファイル
```

## 検索

### findコマンド
指定したでディレクトリ配下から、検索条件に当てはまる検索結果が表示される

#### - オプション

```shell-session: cmd
$ find ディレクトリ 検索条件

$ find . -name "*.txt"
./file1.txt
./file2.txt
./file3.txt

$ find . -type d
.
./ubuntu
```

| op名 | 説明 |
|:-----------|:------------|
| -name  | 検索名をワイルドカードなどで指定|
| -type  | ファイル種別の指定 |



#### - typeコマンドの種別
```shell-session: cmd
$ find . -type d -name "user*"
$ find . -type f
$ find . -type l
```

| 入力値 | 種別 |
|:-----------|:------------|
| d  | ディレクトリ|
| f  | ファイル |
| l  | シンボリックリンク |

### grepコマンド
正規表現を使った検索
```shell-session: cmd
$ grep ディレクトリ 正規表現

```

:::note info
ハイフン(-)の検索
`grep -`でハイフンを含む文字列の検索はできない
ハイフンの検索を行う場合は、`grep - -`で実行する
:::

## パーミッションの変更

### 数値

全ての権限をまとめて変更が可能
設定したい権限パターンを数値で指定する

権限パターンは7種類存在しており、
それぞれの権限パターンの数値は以下となる
| 読み取り(r) | 書き込み(w) | 実行(x) | 権限パターン(cmd) | 
|:-----------:|:-----------:|:-----------:|:-----------:|
| ○  | - | - |`4`|
| -  | ○ | - |`2`|
| -  | - | ○ |`1`|
| ○  | ○ | - |`6`|
| -  | ○ | ○ |`3`|
| ○  | - | ○ |`5`|
| ○  | ○ | ○ |`7`|

```shell-session: cmd
$ chmod 764 change.sh

```


### シンボル
一部の権限の変更が可能
「誰に」、「設定する」、「権限」を指定する


***シンボル: 誰に***
| 誰に | cmd | 
|:-----------|------------:|
| オーナー  | `u`  | 
| グループ  | `g`  | 
| その他のユーザー | `o`  | 
| 全てのユーザー | `a`  | 

***シンボル: 設定するか***
| 設定するか | cmd | 
|:-----------|------------:|
| 権限追加  | `+`  | 
| 権限削除  | `-`  | 
| 指定した権限に設定する | `=`  | 


***シンボル: 権限***
| 権限 | cmd | 
|:-----------|------------:|
| 読み取り  | `r`  | 
| 書き込み  | `w`  | 
| 実行 | `x`  | 




例えば、その他のユーザーに実行権限を追加する場合
```shell-session: cmd
$ chmod o+x change.sh

```






## 特定文字(意味を持つ文字列)を文字列として扱う
linuxコマンドで意味を持つ「\」「?」「!」..などを文字列として扱いたい場合は以下の方法を使う

### バックスラッシュ
全ての特殊文字を文字列として扱うことができる
```shell-session: cmd
$ echo \~
~
```

### シングルコーテーション
バックスラッシュと同様に全ての特殊文字を文字列として扱うことができる
```shell-session: cmd
$ echo '~'
~
```

### ダブルコーテーション
一部の特殊文字のみ文字列として扱うことができr
「!」「$」「`」は文字列として扱われない
```shell-session: cmd
$ echo !2
echo ls -l
ls -l
$ echo "!2"
echo ls -l
ls -l
$ echo "\2"
\2
```

## リンク
### ハードリンク
ファイルに別名を追加で結びつける
ディレクトリに対してはハードリンクは使用できない

下記のコマンドで作成した「system2.conf」は「system.conf」と同じファイルを参照することになる
```shell-session: cmd
$ ln sytem.conf system2.conf
$ ls -l
-rw-r--r-- 2 root root    0 Feb  2 10:29 system.conf
-rw-r--r-- 2 root root    0 Feb  2 10:29 system2.conf
```

「sytem2.conf」を削除した場合どうなるか？？


```shell-session: cmd
$ rm sytem2.conf
$ ls -l
-rw-r--r-- 1 root root    0 Feb  2 10:29 system.conf
```
複数ハードリンクが存在する
ファイルのハードリンクを削除しても実ファイルは削除されない。

この場合、「system2.conf」を削除しても「system.conf」のハードリンクがまだ残っている。
そのため、実ファイルはまだ削除できていない

ただ、「system2.conf」のハードリンクが削除されたことで、「system.conf」のハードリンク数が「2」から「1」に減っている。

そしたら、「system.conf」のハードリンクを削除した場合どうなるか？？
```shell-session: cmd
$ rm system.conf
$ ls -l
void
```
「system.conf」に紐づいていた実ファイルは、紐づくハードリンクを完全に失ったため実ファイルも削除された



### シンボリックリンク
名前空間に名前空間を結びつけるのがシンボリックリンク
ハードリンクと違いディレクトリにも使用できる
紐づき先が存在しなくても存在できるなど、windowsのショートカットに近い？

ハードリンク作成コマンドに「-s」オプションを付与することでシンボリックリンクの作成ができる

```shell-session: cmd
$ ln -s sytem.conf system.conf.link
$ ls -l
-rw-r--r-- 1 root root    0 Feb  2 12:33 system.conf
lrwxrwxrwx 1 root root   11 Feb  2 12:33 system.conf.link -> system.conf
```

:::note warn
注意
リンク先ファイルやディレクトリは絶対パスでの指定を推奨する。相対パスで指定してしまうとシンボリックリンクが格納されているディレクトリ起点のパスとなってしまうため、想定しないファイルやディレクトリに紐づいてしまう
:::

## リダイレクト
| cmd | 結果 | 
|:-----------|------------:|
| `< file`  | 入力を指定したファイルに変更  | 
| `> file` | 出力を指定したファイルに変更  | 
| `2> file` | エラーをファイルに出力する  | 
| `>> file` | 出力をファイルの末尾に追記  | 
| `2>> file` | エラーをファイルの末尾に追記  | 
| `>file 2>&1` | 出力とエラーをファイルの末尾に追記  | 

:::note info
`/dev/null`の活用
デバックでエラーのみ確認したい場合、出力先に`/dev/null`を指定することでエラーのみ確認することができる
:::

## プロセス管理

### プロセス一覧
```shell-session: cmd
$ ps
  PID TTY          TIME CMD
    9 pts/1    00:00:00 bash
   43 pts/1    00:00:00 ps
```

| 列名 | 説明 | 
|:-----------|------------:|
| PID  | プロセスID  | 
| TTY | ターミナル識別<br>デーモンは「?」で表示される  | 
| TIME | CPU使用時間  | 
| CMD | コマンドファイル  | 

#### - 全てのユーザー/デーモンを含める
```shell-session: cmd
$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.4   4944  4192 pts/0    Ss+  05:54   0:00 /bin/bash
root         9  0.0  0.4   4944  4404 pts/1    Ss   05:54   0:00 /bin/bash
root        51  0.0  0.3   5592  3388 pts/1    R+   06:29   0:00 ps aux
```

### プロセス終了
```shell-session: cmd
$ kill プロセスID
  [1]+  Terminated              prosess001
```

### プロセス強制終了
```shell-session: cmd
$ kill -9 プロセスID
  [1]+  Killed              prosess001
```

#### - killコマンドの全てのシグナル
```shell-session: cmd
$ kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX
```


## コマンドライン操作

### カーソルの移動

| 操作 | cmd | 説明 |
|:-----------|------------:|------------:|
| 後方に移動  | `ctrl + b`  | 矢印キー(←)と同じ|
| 前方に移動  | `ctrl + f`  | 矢印キー(→)と同じ|
| 行頭に移動  | `ctrl + a`  | コマンドの一番左に移動|
| 行末に移動  | `ctrl + e`  | コマンドの一番右に移動|

### 文字の削除
| 操作 | cmd | 説明 |
|:-----------|------------:|------------:|
| 1単語の削除  | `ctrl + w`  | 単語単位で削除|

### 切り取り(カット)とペースト(ヤンク)
| 操作 | cmd | 説明 |
|:-----------|------------:|------------:|
| カーソルから行末を切り取り  | `ctrl + k`  | -|
| カーソルから行頭を切り取り  | `ctrl + u`  | -|
| ペースト  | `ctrl + y`  | -|


## コマンド履歴の確認
```shell-session: cmd
$ history
   1  cd hme
   2  cd /home
   3  l -l
   4  pwd
$ !2 ← 履歴からコマンドを実行
```