Linux基礎コマンドについて

## はじめに
記事を閲覧いただきありがとうございます。
今回はLinux基礎コマンドについて解説をしていきます。

## Linuxとは
Windowsやmacと同じように、OS(オペレーティングシステム)の一種です。
Linuxの特徴として、オープンソースが挙げられます。オープンソースのため誰でもLinuxの開発を行うことができます。

## cd
カレントディレクトリ(現在のディレクトリ)の変更をするコマンド
```
# cd [オプション]<遷移したいディレクトリ>
$ cd /home/testuser/

# 何も指定しない場合はホームディレクトリ(~)に遷移
$ cd 
```

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

ディレクトリの内容の説明は下記の記事が分かりやすいです。

https://26gram.com/directory-meaning

## pwd
カレントディレクトリを表示するコマンド

```
# pwd [オプション]
$ pwd
/home/testuser
```

:::note info
今どのディレクトリにいるの？となった場合はpwdコマンドで確認しましょう
:::

## ls
ファイルのディレクトリの一覧を表示するコマンド

```
# ls [オプション]<ディレクトリ・ファイル名>
$ ls /
bin dev Users home　・・・・

#複数のディレクトリを指定することも可能
$ ls / /Users
/: 
bin dev Users home　・・・・

/Users:
Shared testuser
```

### よく使うオプション
- **-l**
ファイルの詳細情報を表示する

```
$ ls -l
drwx------@   7 testuser  staff    224  9 28 22:30 Applications
```

- **-a**
隠しファイルの含めた全てのファイルを表示する
「.」で始まるファイルは隠しファイルとみなされて通常は表示されない

```
$ ls -a
.bash_history
.bash_profile
.bundle
```

## mkdir
ディレクトリを作成するコマンド

```
# mkdir [オプション]<作成するディレクトリ>
# testディレクトリを作成
$ mkdir test
```

### オプション
- **-p**
深いディレクトリを一度に作成する

```
# test/2024/01ディレクトリを作成
$ mkdir -p test/2024/01
```

## rmdir 
<font color="red">空</font>のディレクトリを削除するコマンド
```
# rmdir <ディレクトリ名>
$ rmdir test
```

:::note alert
空でないディレクトリを削除しようとすると、
`rmdir: [ディレクトリ名]: Directory not empty`とエラーが出ます。
:::

## cat
ファイルの中身を確認するコマンド
```
# cat [オプション]<ファイル名>
$ cat /etc/hosts
127.0.0.1	localhost
::1             localhost

$ cat ~/test/test.txt
テキストの内容が表示される
```

### オプション
- **-n**
行番号を表示するオプション。
文字列のみより分かりやすくなりますね。

```
$ cat -n /etc/hosts
1 127.0.0.1	localhost
2 ::1             localhost
```

## less
ファイルの中身をスクロールするコマンド

```
# less [オプション]<ファイル名>
$ less ~/test/test.txt
longtext ・・・
・・・・
・・・・
```

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

### 検索の操作方法
|コマンド|内容|
|:---:|:-:|
|/<文字列>|下方向に向かって検索|
|?<文字列>|上方向に向かって検索|
|n|次の検索結果に移動|
|N|前の検索結果に移動|

`/<文字列>`で検索をして、`n`や`N`で検索結果を確認していきます。

## tail
ファイルの中身を行数を絞って表示するコマンド

```
# tail　[オプション]<ファイル名>
$ tail test.txt
# test.txtファイルの末尾10行を出力する　※何もオプション指定なければ既定は末尾10行
```

### オプション
・ **-n 行数** 
表示する行数を指定する。指定しない場合は末尾10行を表示。
```
$ tail -n 3 test.txt
```

# touch
<font color="red">空</font>のファイルを作成するコマンド
```
# touch <ファイル名>
$ touch test.txt

# 複数ファイル作成も可能
# touch <ファイル名1> <ファイル名2>
$ touch test1.txt test2.txt
```

:::note info
ファイルが存在していない場合は、空のファイルを作成します。
ファイルがすでに存在している場合は、タイムスタンプを更新します。
(何もせずに上書きと同じです)
:::

# rm
ディレクトリ・ファイルを削除するコマンド
```
# rm [オプション]<削除するファイル名>
$ rm test.txt
```

:::note alert
rm単体で実行するとゴミ箱に行くのではなく、本当に削除されるので注意して操作しましょう。
:::

## オプション
・ **-r**
ディレクトリ・ディレクトリの中のファイルを一括削除する。
```
# rm -r <ディレクトリ名>
$ rm -r test_202401
```

・　**-f**
ファイルを削除する際に警告文を表示しない
```
# rm -f <ファイル名>
$ rm -f test.txt
```

・　**-i**
ファイルの削除前に確認する
```
# rm -i <ファイル名>
$ rm -i test.txt
remove test.txt? <y/nを入力>
```

# mv
ファイルの移動、ファイル名を変更するコマンド
```
# mv [オプション] <移動元> <移動先>

# ファイル名変更
# mv <ファイル名1> <ファイル名2>
# file1.txtをfile2.txtに変更
$ mv file1.txt file2.txt


# ファイルを移動
# mv <ファイル名> <移動先>
# file1.txtをdirディレクトリ直下に移動
$ mv file1.txt dir/

# ディレクトリごと移動
# mv <ディレクトリ名> <ディレクトリ名>
# TEST_2024ディレクトリをTESTディレクトリ直下に移動
$ mv TEST_2024 TEST
```

### オプション
・ **-i**
上書きする前に確認する
```
$ mv -i file1.txt file2.txt
overwrite file2.txt? <y/nを入力>
```

## cp 
ファイル・ディレクトリをコピーするコマンド
```
# cp [オプション] <コピー元> <コピー先>
# cp file1.txtの内容をfile10.txtにコピー
$ cp file1.txt file10.txt
```

### オプション
・ **-i**
上書きする前に確認する
```
$ cp -i file1.txt file2.txt
overwrite file2.txt? <y/nを入力>
```

・ **-r**
ディレクトリをコピーする
```
# TESTディレクトリをTEST_NEWにコピー
$ cp -r TEST TEST_NEW
```

## ln
リンクを貼るコマンド
リンク・・・ファイルに別名をつけること

リンクには以下の2種類があります。
|リンク|説明|
|:--:|:--|
|ハードリンク|・ファイルの実体に複数のファイル名をつける<br>　(あだ名のようなもの)<br>・元ファイルを削除しても消えない|
|シンボリックリンク|・リンク先のパス名が書かれたファイル<br>・ファイルの実体を削除したり、移動したりするとファイルが参照できなくなる。

```
# ln [オプション]<リンク元ファイル名><リンク名>
#　ハードリンクを貼る
$ ln file1 file2
```

### オプション
・ **-s**
シンボリックリンクを貼る
```
$ ln -s file1 file3
```

## find
ファイルを検索するコマンド

```
# find <検索開始ディレクトリ> <検索条件> <アクション>
# アクション：-print・・・見つけたファイルをフルパスで出力
$ find . -name file1.txt -print
```

### 検索条件
・　**-name**
ファイル名を指定してファイルを検索する。`ファイルの大文字小文字は区別する。`

```
$ find . -name file1.txt

# ワイルドカード使えます
$ find . -name '*file*' -print
```

・**-iname**
ファイル名を指定してファイルを検索する。`ファイルの大文字小文字は区別しない。`
```
$ find . -iname FILE1.txt
./file1.txt
```

## chmod
ファイルやディレクトリのパーミッションを設定するコマンド。
ファイルやディレクトリは扱う所有者、グループ、その他の人たちが、実行できるか・書き込みできるか・読み込みできるかを設定することができる。
```
# パーミッションの確認
$ ls -l file1.txt
-rw-r--r--  1 testuser  staff  0  1 13 12:17 file1.txt
```
![スクリーンショット 2024-01-13 16.57.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1003708/39e5020a-a464-e7d2-4444-eaea058741ed.png)

|パーミッション|権限|数値|
|:-------:|:--:|:-:|
|r|読み取り|4|
|w|書き込み|2|
|x|実行|1|

```
#　 パーミッションを設定
# chmod [ugoa][+-=][rxw]<ファイル名>
$ chmod u+r file
```

|記号|内容|
|:-:|:--:|
|u|所有者の権限|
|g|グループの権限|
|o|その他ユーザーの権限|
|a|前ユーザーの権限|
<br>

|記号|内容|
|:-:|:--:|
|+|権限を追加|
|-|権限を削除|
|=|記述した権限にする|

### chmodコマンドは数値でも指定が可能
※パーミッションの数値に関しては、パーミッションの確認記載箇所に記載しています。
```
# chmod <8新数の数値><ファイル名>
$ chmod 745 file
```
745の出し方について
![スクリーンショット 2024-01-13 17.15.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1003708/7607b9d1-2dec-cf14-b32f-063727407ad9.png)

## chown
ユーザーやグループの所有権を変更するコマンド
```
# ユーザー・グループの所有権を確認する
$ ls -l file1.txt
-rw-r--r--  1 testuser  staff  0  1 13 12:17 file1.txt
# ユーザー所有権→testuser グループ所有権→staff

# ユーザー所有権を管理者(root)にしたい
# chown <オプション> <ユーザーorグループ> <ファイルorディレクトリ>
$ chown root file1.txt
chown: file1.txt: Operation not permitted
#　操作権限がありませんとエラーが出てきましたね。

# sudoコマンドを使用してroot権限で実行すれば実行できます。
$ sudo chown root file1.txt
-rw-r--r--  1 root  staff  0  1 13 12:17 file1.txt

# グループの所有者も管理者(root)にしたい場合・・
$ chown root:root file1.txt
```

## sudo
管理者権限を持つ特別なユーザー(スーパーユーザー)として操作を実行できるコマンド。
システムの根幹に関わる操作はスーパーユーザーだけが操作できるようになっている。
```
# sudo <コマンド>
$ sudo mkdir /storage
```

## ps
実行中のプロセスを表示するコマンド
プロセス・・・実行中のプログラムのこと
```
# ps [オプション]
$ ps
  PID TTY           TIME CMD
16674 ttys001    0:00.35 -zsh
77193 ttys005    0:00.04 /opt/homebrew/bin/zsh -il
```

PID・・・プロセスID
CMD・・・実行中のコマンド

## jobs 
現在のジョブ一覧を表示するコマンド
```
$ jobs
[1]+ 実行中 sleep 100 %
```

## kill
ジョブやプロセスを終了させるコマンド
```
# ジョブを終了させる
# kill [オプション] %<ジョブID>
$ kill %1

# プロセスを終了させる
# kill [オプション] <プロセスID>
$ kill 4621
```

## さいごに
今回はLinux基礎コマンドについて紹介しました。
LinuxについてはUdemyの「もう怖くないLinuxコマンド。手を動かしながらLinuxコマンドラインを5日間で身に付けよう」が分かりやすかったです。(この記事も上記動画を参考に作成しました。)
今後フロント技術部分が学び終わったあたりで少しLinuxは深掘りしてみたいと思います。

## 参考文献
Udemy 「もう怖くないLinuxコマンド。手を動かしながらLinuxコマンドラインを5日間で身に付けよう」 講師:山浦 清透

https://www.udemy.com/share/102dIu3@4Ovai-pVmmwyU6ha1uV4TyiUudSi84AMqOc49G-u0Hb6QMDp-lGVkLssRMZRoo3-/