【完全版】Linuxコマンドチートシート

# はじめに
 　今回の記事は、私がエンジニア1年のなかで使用頻度の高いコマンドから、これ便利だったなというコマンドを、あとで見返せるようにチートシート的な感じでまとめていきます。
　また、コマンドのオプションについて、紹介してるもの以外にもいろいろありますが、あくまで自分が業務内で使用したオプションや、使用頻度が高いオプションに絞って紹介していますのでご了承ください。
# 事前準備
　本書は、以下のように**コマンド**、**説明**、**例**、**オプション**、**コメント**の構成に則って解説していきます。
## コマンド:beginner:～:star::star::star:(難易度)
・ここに***説明***を書きます
```:コマンドの使用例
 構文：コマンド [オプション] ファイル名
[]    ：任意、指定しなくてもよい
[]なし：必須、指定しないと動作しない
 
[user@localhost ~]$ ここに例を書きます
``` 
|`オプション`    |`説明`|
|:----------:|--------------------------|
|オプション  |ここに**オプションの説明**を書きます|
|オプション  |オプションに関しては使用頻度が高い順に書きます|

:::note
:point_up:***ここに<font color="Red">コメント</font>を書きます***:point_up:
:::
:::note warn
:point_up:***ここに<font color="Red">注意すべきこと</font>を書きます***:point_up:
:::
:::note alert
:point_up:***ここに<font color="Red">やってはいけないこと</font>を書きます***:point_up:
:::
# 前章：Linuxの構造について
・Linuxでは、**<font color="Red">FHS</font>**(Filesystem Hierarchy Standard)という既定に基づいて標準化されたファイルシステム(ディレクトリ構造)を採用しています。
　これにより、CentOSやDebianなど異なるディストリビューションでも基本的なディレクト構成は統一されています。

・FHSは、ディレクトリの最上位階層である**ルートファイルシステム**( **/** )に含める必要があるディレクトリや各ディレクトリの役割、ファイルの配置場所を定義しており、ルートには以下の5つのディレクトリを含める必要があります。

:black_small_square:**ルートに含める必要のあるディレクトリ**
|`ディレクトリ名`    |`説明`|
|:----------:|----------------------------|
|*/bin* |一般ユーザでも実行可能な基本的はコマンドを格納|
|*/sbin*|rootユーザのみが実行可能なシステム管理コマンドを格納|
|*/etc*|システムやコマンドの各種設定ファイル、スクリプトファイルを格納|
|*/dev*|ハードディスク、CD-ROM、DVD－ROMなどデバイスファイルを格納|
|*/lib*|共有ライブラリ、カーネルモジュールを格納|

:black_small_square:**ルート以外の主なディレクトリ**
|`ディレクトリ名`    |`説明`|
|:----------:|----------------------------|
|*/opt* |追加のパッケージやプログラムがインストールされるディレクトリ|
|*/root*|rootユーザ専用のディレクトリ|
|*/home*|一般ユーザ専用のディレクトリ|
|*/tmp*|一時的な作業ディレクトリ、全てのユーザが読み書き可能|
|*/var* ※1|システム関連のログファイルを格納するディレクトリ|
|*/usr* ※2|一般ユーザが共用するコマンド、ライブラリ等を格納|

:black_small_square:**/var配下の主なディレクト**※1
|`ディレクトリ名`    |`説明`|
|:----------:|----------------------------|
|*/var/log* |システムのログファイル(messages)、メールログ(maillog)などを格納|
|*/var/run*|システム状態を示すファイルを格納|
|*/var/spool*|送信待ちメール(/var/spool/mqueue)などを格納|

:::note 
**cronの実体はどこに？？**
余談なりますが、ユーザごとに存在する定時処理を行うための`cron`の実態の格納先は、`/var/spool/cron`に格納されています。
:point_right:[cronとはなんぞや](https://qiita.com/Tun/items/300c152ebdbe31d8ca91)

:::
:black_small_square:**/usr配下の主なディレクト**※2
|`ディレクトリ名`    |`説明`|
|:----------:|----------------------------|
|*/usr/bin* |一般ユーザ、rootユーザが使用する基本コマンドを格納|
|*/usr/sbin*|システム管理コマンドを格納|
|*/usr/lib*|プログラムに必要な共有ライブラリを格納|

# 基本的なファイル操作コマンド:beginner:
## lsコマンド(<font color="red">l</font>ist <font color="red">s</font>egments)
・ファイルの一覧を表示するコマンドで、オプション次第でファイル属性、ディレクトリ一覧の情報を取得することができます。
　また、コマンド実後の出力結果では、ファイル種別により、**<font color="Blue">ディレクトリ</font>**、**<font color="Cyan">シンボリックリンク</font>** 、**<font color="YellowGreen">実行可能ファイル</font>**、**<font color="Red">圧縮ファイル/アーカイブ</font>**、**<font color="Magenta">画像</font>**  のように異なる色で表示されます。
 ```:lsコマンド出力結果
 構文：ls [オプション] [ファイル名 or ディレクトリ名]
 
[user@localhost ~]$ ls /   # ルートディレクトリ配下の情報を検索
bin  boot  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  sbin  selinux  srv  sys  tmp  usr  var
``` 
|`オプション`    |`説明`|
|:----------:|--------------------------|
|*-l*  |ファイルの属性(種類、保護モード、所有者など)の情報を表示|
|*-t*  |日付順に表示|
|*-r*  |出力結果を降順で表示|
|*-R*  |再帰的にディレクトリとその配下全てのファイルを表示|
|*-a*  |隠しファイルを含む全てのファイル名を表示|
|*-h*  |ファイルサイズをK、M、Gなど単位で表示|

:::note
**オプションは複数指定できるの？？**:thinking:
`ls`コマンドに限らずLinuxコマンドのオプションは、複数指定することで出力結果が見やすくなったり、全く別の挙動になったりします。
`ls`コマンドに関して、`-l`を指定すると、**パーミッション**、**所有者**、**サイズ**、**更新日時**を見ることができます。
また、オプションを指定しないと操作しないコマンドも存在します。(例：`tar`)

:point_down:**よく使う`ls`コマンドのオプション組み合わせ**:point_down:
 ```:実行例 
 【以下のような構造の場合】
 /home/user
 ├─test.sh
 ├─SymbolicDir
 └─TestDir
   └─hoge.txt
 
[user@localhost ~]$ ls -ltr /home/user   # ファイルを日付順の降順で表示
-rw-rw-r-- 1 user user  100  1月 1 00:00 2025 test.sh
drw-rw-r-- 1 user user 4096 12月 1 00:00 2024 TestDir
lrw-rw-r-- 1 user user    2 11月 1 00:00 2024 SymbolicDir -> TestDir


[user@localhost ~]$ ls -lR /home/user   # 検索対象ディレクトリ配下を全て表示
.:
total 8
-rw-rw-r-- 1 user user  100  1月 1 00:00 2025 test.sh
drw-rw-r-- 1 user user 4096 12月 1 00:00 2024 TestDir
lrw-rw-r-- 1 user user    2 11月 1 00:00 2024 SymbolicDir -> TestDir

./TestDir
total 8
rw-rw-r-- 1 user user  200  1月 1 00:00 2025 hoge.txt
```
:::

## catコマンド(<font color="red">concatenate</font>)
・ファイル内容を表示するコマンド、ログとかの確認の際に使用していましたが、オプションを指定して使用することはあまりなかった印象です。
 ```:catコマンド出力結果
 構文：cat [オプション] ファイル名
 
[user@localhost ~]$ cat test.txt   # test.txtの内容を表示
Hello,My name is Tun.
``` 
|`オプション`    |`説明`|
|:----------:|--------------------------|
|*-n*  |各行ごとに行番号を付加して表示|

## touchコマンド
・ファイルのタイムスタンプ(最終アクセス日時・最終更新日時)を変更するコマンドです。
しかし、時間を指定せずに実行すると**空のファイル**が作成されるという、空ファイル作成の用途で多く使用していました。
 ```:touchコマンド出力結果
 構文：touch [オプション] ファイル名
 
[user@localhost ~]$ touch test.txt   # 空のファイルを作成
[user@localhost ~]$ ls -l            # 作成されていることの確認
-rw-rw-r-- 1 user user  0  1月 1 00:00 2025 test.txt
``` 
|`オプション`    |`説明`|
|:----------:|--------------------------|
|*-t*  |タイムスタンプをYYYYMMDDhhmmに変更|
|*-a*  |最終アクセス日時のみを変更|
|*-m*  |最終更新日時のみを変更|

## cpコマンド(<font color="red">c</font>o<font color="red">p</font>y)
・ファイルのコピーやディレクトリのコピーを行うコマンドです。
 ```:cpコマンド出力結果
 構文：cp [オプション] コピー元ファイル名 コピー先ファイル名
 構文：cp [オプション] コピー元ファイル名 コピー先ディレクトリ名
 構文：cp [オプション] コピー元ディレクトリ名 コピー先ディレクトリ名
 
 
[user@localhost ~]$ cp -p /home/log/*log /home/log/bk   # 全てのログをbkディレクトリにバックアップ
[user@localhost ~]$ ls -l /home/log/bk
-rw-rw-r-- 1 user user  100  1月 1 00:00 2025 test.log
-rw-rw-r-- 1 user user  100  1月 2 00:00 2025 test1.log

``` 
|`オプション`    |`説明`|
|:----------:|--------------------------|
|*-p*  |コピー先のファイル属性(パーミッション、所有者等)を保持してコピー|
|*-r*  |ディレクトリ内を再帰的にコピー|
|*-f*  |コピー先に同じ名前のファイルがある場合は上書き|
|*-i*  |コピー先に同じ名前のファイルがある場合は上書きするかどうか確認|

:::note
**よく使うオプション**
基本的に`cp -p`と`cp -pr`の二つさえ抑えておけば大丈夫かと思います。
:point_down:**`cp -pr`の挙動確認**:point_down:
 ```:実行例 
 【コマンド実行前の構造】
  /home/user
 ├─TestDir　　
 | └─test.sh  ←これを/TestDir2配下にディレクトリごとコピー
 └─TestDir2
   └─ここにコピーしたい
   
[user@localhost ~]$ ls -lR /home/user   # homeディレクトリ内を確認
.:
total 8
drw-rw-r-- 1 user user 4096 12月 1 00:00 2024 TestDir
drw-rw-r-- 1 user user 4096 12月 1 00:00 2024 TestDir2

./TestDir:
total 8
rw-rw-r-- 1 user user  100  1月 1 00:00 2025 test.sh

[user@localhost ~]$ cp -pr TestDir /home/TestDir   # 対象ファイルをディレクトごと
[user@localhost ~]$ ls -lR /home/user   # homeディレクトリ内を確認
.:
total 8
-rw-rw-r-- 1 user user  100  1月 1 00:00 2025 test.sh
drw-rw-r-- 1 user user 4096 12月 1 00:00 2024 TestDir

./TestDir:
total 8
rw-rw-r-- 1 user user  100  1月 1 00:00 2025 test.sh

./TestDir2/TestDir:
total 8
rw-rw-r-- 1 user user  100  1月 1 00:00 2025 test.sh

 【コマンド実行後の構造】
  /home/user
 ├─TestDir　　
 | └─test.sh
 └─TestDir2
   └─TestDir　　
      └─test.sh 
```
:::

## mvコマンド(<font color="red">m</font>o<font color="red">v</font>e)
・ファイルの移動を行うコマンドで、同じ階層のディレクトリ内でファイルを移動した場合、実質ファイル名の変更と同じ挙動になるため、　`mv`コマンドはファイル名変更で使用することがあります。
 ```:mvコマンド出力結果
 構文：mv [オプション] 移動元ファイル名/移動元ディレクトリ名 移動先ディレクトリ名
 構文：mv [オプション] 名前変更前ファイル名/変更前ディレクトリ名 変更後ファイル名/変更後ディレクトリ名
 
 
[user@localhost ~]$ mv test.sh test2.sh             # ファイル名をtest.shからtest2.shに変更
[user@localhost ~]$ mv test.sh /home/user/TestDir   # test.shを「/home/user/TestDir」配下へ移動
``` 
|`オプション`    |`説明`|
|:----------:|--------------------------|
|*-f*  |移動先に同じ名前のファイルがある場合は上書き|
|*-i*  |移動先に同じ名前のファイルがある場合は上書きするか確認|

:::note warn
**シェルを作成する場合に<font color="Red">`mv`コマンド</font>を使用して名前変更してもいいの？？**
Linuxサーバには隠しファイル`.bash_profile`という**環境変数**や現場によっては**エイリアス**を設定するファイルが存在します。
この`.bash_profile`には **`mv`** を **`mv -i`** という風にエイリアスを設定している場合があります。(`rm`コマンドも同様)
これは、ユーザの誤操作でファイルの移動や削除するという**ヒューマンエラー**を防止する働きがあります。

:loudspeaker: :point_down_tone3:※**筆者の体験談です**:point_down_tone3:
しかしこれの何が問題かというと、`-i`オプションは実行するたびに上書きをしてよいか確認してくるので、もし仮に重要な定時処理を担うシェルスクリプトに記述してしまうと、**<font color="Red">意図しない箇所で止まってエラーもはかず</font>** に処理が実行されないということが起きてしまう可能性があります:bangbang:

:point_right_tone3: 詳細を調べると、**シェルスクリプト**を実行する場合は環境変数を読み込まないようになっているみたいで、`mv`コマンドは本番環境でも確認されることなく無事に実行されていました・・・。
(リリース前日に、「ここって上書き確認されないよね？大丈夫？」って言われたときは冷や汗止まりませんでした、結局動いてくれたのでよかった:sob:)
:::
## rmコマンド(<font color="red">r</font>e<font color="red">m</font>ove)
・ファイルやディレクトリの削除を行うコマンドです。
 ```:rmコマンド出力結果
 構文：rm [オプション] ファイル名 or ディレクトリ名
 
[user@localhost ~]$ rm -f test.sh    # ファイルを確認なしで削除
[user@localhost ~]$ rm -rf TestDir   # ディレクトリ配下を確認なしで全て削除
``` 
|`オプション`    |`説明`|
|:----------:|--------------------------|
|*-f*  |削除の確認を行わない|
|*-r*  |ディレクトリも含めて、ディレクトリとファイルの全てを削除する|
|*-i*  |削除する前に確認する|

:::note alert
**`-f`は便利だけど乱用禁止**:x:
前述のとおり、コマンド実行時の確認(エイリアス設定時等)は便利な反面、面倒であり正しく動作しない場合があります。
`rm`コマンドには**確認なしで強制突破するオプション**が備わっています！
しかし、楽だからと言って乱用、特に管理者(**`root`ユーザ**)の場合に使用しすぎると、その癖が抜けないようになってしまい、ルートディレクトリでコマンドを実行してしまうと**サーバの全ファイル**を削除してしまい取り返しのつかないことになってしまいます！
:warning:初心者の方は **<font color="Red">慎重にコマンドを実行</font>** してください！
:::
# ディレクトリを管理・操作コマンド:beginner:
## pwdコマンド(<font color="red">p</font>rint <font color="red">w</font>orking <font color="red">d</font>irectory)
・現在の作業ディレクトリを確認するコマンドです。
 ```:pwdコマンド出力結果
 構文：pwd [ディレクトリ名] 
 
[user@localhost ~]$ pwd    # 現在の作業ディレクトリを確認 
/home/user 
```

## cdコマンド(<font color="red">c</font>hange <font color="red">d</font>irectory)
・現在の作業ディレクトリを変更(移動)するコマンドです。とてもよく使うコマンドの一つです。
 ```:mvコマンド出力結果
 構文：cd [ディレクトリ名] 

[user@localhost ~]$ pwd                  # 現在の作業ディレクトリを確認
/home/user
[user@localhost ~]$ cd /home/user/log    # /home/user/logに移動
[user@localhost log]$pwd                 # 移動できたかの確認
/home/user/log
``` 
:::note
**`cd`コマンドは相対パス？絶対パス？**
`cd`コマンドはどちらのパス指定でも移動できますが、移動したい先のパスがわかっているのであれば**絶対パス**で、移動先が決まってない場合は**相対パス**で移動したほうが効率はいいかなと思います。
また、**`tab`補完機能**を使えば、絶対パスの指定を省略できます！！

:white_check_mark: **<font color="Red">指定次第で移動先が変わる！</font>**:white_check_mark:
当たり前のこと言ってますが、以下の指定次第で移動が楽になります！
```:cdコマンドの指定先
[user@localhost ~]$ cd /home/user/log    # これが普通の移動の方法
[user@localhost ~]$ cd 　                # ユーザのホームディレクトリに移動
[user@localhost ~]$ cd ~                 # これもホームディレクトリに移動
[user@localhost ~]$ cd ..                # 親ディレクトリに移動
:::
## mkdirコマンド(<font color="red">m</font>a<font color="red">k</font>e <font color="red">dir</font>ctory)
・ディレクトリを作成するコマンドです。
 ```:mkdirコマンド出力結果
 構文：mkdir [オプション] ディレクトリ名 

[user@localhost ~]$ pwd                  # 現在の作業ディレクトリを確認
/home/user
[user@localhost ~]$ cd /home/user/log    # /home/user/logに移動する。 
[user@localhost log]$pwd                 # 移動できたかの確認
/home/user/log
``` 
## rmdirコマンド(<font color="red">r</font>e<font color="red">m</font>ove <font color="red">dir</font>ctory)
・ディレクトリを削除するコマンドで、削除するには削除対象のディレクトリは空である必要があります。
**全くと言っていほど使いません。**
 ```:rmkdirコマンド出力結果
 構文：rmdir ディレクトリ名
[user@localhost ~]$ rmdir user               # userディレクトリを削除
``` 
# 応用的なファイル操作コマンド:star:
## headコマンド
・ファイルの先頭から10行を表示するコマンドで、ログファイルを確認するときなどに使用していました。（オプションなしのデフォルトが10行）

 ```:headコマンド出力結果
 構文：head [オプション] ファイル名
 
[user@localhost ~]$ head -n 3 test.txt   # test.txtの内容を先頭から3行表示
1
2
3
``` 
|`オプション`    |`説明`|
|:----------:|--------------------------|
|*-n*  |先頭から表示する行数の指定|
|*-行数*  |先頭から表示する行数の指定|
|*-c*  |先頭から表示するバイト数の指定|
## tailコマンド
・ファイルの末尾から10行を表示するコマンドで、これもログファイルを確認するときなどに使用していました。（オプションなしのデフォルトが10行）

 ```:tailコマンド出力結果
 構文：tail [オプション] ファイル名
 
[user@localhost ~]$ tail -n 3 test.txt   # test.txtの内容を末尾から3行表示
8
9
10
``` 
|`オプション`    |`説明`|
|:----------:|--------------------------|
|*-n*  |末尾から表示する行数の指定|
|*-行数*  |末尾から表示する行数の指定|
|*-c*  |末尾から表示するバイト数の指定|
|*-f*  |ファイルの末尾に追加された行をリアルタイムで表示|

:::note
**ログファイルの監視にとても便利:exclamation:**
`tail -f`はリアルタイムのログ監視にとても便利です。
リリース作業をした後に、既存の処理が正しく動作しているか、エラーログをはいていないかなどの確認する際に、かなり使用していました。
 ```:tail -f の実行例
[user@localhost ~]$ tail -f test.log   # test.logをリアルタイムで監視
~省略~
2025/01/01 12:00 〇〇処理：正常終了
2025/01/01 12:10 〇〇処理：正常終了
2025/01/01 12:20 〇〇処理：正常終了
```
:::

## sortコマンド
・行単位でファイルの内容をソートするコマンドです。オプション指定なし(デフォルト)の場合、昇順にソートする。

 ```:sortコマンド出力結果
 構文：sort [オプション] ファイル名
 
[user@localhost ~]$ sort -n -r test.txt   # test.txtの内容を数字として逆順に表示
10
9
8
～省略～
2
1
``` 
|`オプション`    |`説明`|
|:----------:|--------------------------|
|*-r*  |降順にソート|
|*-k*  |ソートのキーとして使用するフィールドを指定|
|*-n*  |数字を文字ではなく数値として処理|
|*-f*  |大文字小文字の区別を無視|
|*-b*  |空白を無視|

:::note
**`ls`コマンドと併用すると便利かも:question:**
`ls -l`の出力結果を、ファイルのサイズの大きい順位ソートする場合は以下のように使用する。
:warning:以下の例で使用している **`|`(パイプ)** は後述します
```:コマンド実行例
[user@localhost ~]$ ls -l /home/user/log      # 現状の確認
-rw-rw-r-- 1 user user  100  1月 1 00:00 2025 test.log
-rw-rw-r-- 1 user user  200  1月 2 00:00 2025 test2.log
-rw-rw-r-- 1 user user  500  1月 3 00:00 2025 test3.log
-rw-rw-r-- 1 user user  400  1月 4 00:00 2025 test4.log
-rw-rw-r-- 1 user user  300  1月 5 00:00 2025 test5.log

[user@localhost ~]$ ls -l /home/user/log | sort -k 5 -n -r # ファイルサイズの大きさを降順で表示
-rw-rw-r-- 1 user user  500  1月 3 00:00 2025 test3.log
-rw-rw-r-- 1 user user  400  1月 4 00:00 2025 test4.log
-rw-rw-r-- 1 user user  300  1月 5 00:00 2025 test5.log
-rw-rw-r-- 1 user user  200  1月 2 00:00 2025 test2.log
-rw-rw-r-- 1 user user  100  1月 1 00:00 2025 test.log
```
:::

## wcコマンド(<font color="red">w</font>ord <font color="red">c</font>ount)
・指定したファイルの行数、単語数、文字数を表示するコマンドです。

 ```:wcコマンド出力結果
 構文：wc [オプション] [ファイル名]
 
[user@localhost ~]$ wc  test.txt   # test.txtの行数、単語数、文字数
10 20 400
``` 
|`オプション`    |`説明`|
|:----------:|--------------------------|
|*-l*  |行数のみ表示　|
|*-c*  |文字数のみ表示|
|*-w*  |単語数のみ表示|

:::note
**`wc`コマンドも他のコマンドとパイプを使用するほうが多い**
```:実行例
【前提条件】
1日24回動作して正常終了するとログをtest.logに出力する処理があるとします
'正常終了'のログが24行あることを確認したい場合

[user@localhost ~]$ cat test.log | grep '正常終了' | wc -l
24
:::

## tarコマンド(<font color="red">t</font>ape <font color="red">a</font>rchive)
・ファイルやディレクトリを1つのアーカイブファイルにしたり、圧縮/展開するコマンドです。
:white_check_mark:複数のファイルを1つのファイルにまとめることを **<font color="Red">アーカイブ</font>** と言います。`tar`コマンドで圧縮するときには **<font color="Red">`-z`</font>** や **<font color="Red">`-j`</font>** を指定する必要があります。
また、オプションを指定するときの`-`(ハイフン)は省略できます。

 ```:tarコマンド出力結果
 構文：tar [オプション] ファイル名
 
[user@localhost ~]$ tar cvf archive.tar test1.txt test2.txt 
# 2つのファイルをarchive.tarという名前でアーカイブ化
``` 
|`オプション`    |`説明`|
|:----------:|--------------------------|
|*-c*  |アーカイブの作成|
|*-v*  |詳細な情報を表示　|
|*-f ファイル名*  |アーカイブするときのファイル名を指定|
|*-x*  |アーカイブからファイルを取り出す(展開する)|
|*-z*  |gzipによる圧縮・展開|

:::note
**`tar`コマンドのオプションはほぼ2種類 :interrobang:**
上記の例ではアーカイブしていますが、その他はそれを展開するときに指定する **`-xvf`** のオプションくらいしか使用する場面がない気がします。
```:tar xvfの実行例
[user@localhost ~]$ tar xvf archive.tar 
# カレントディレクトリにアーカイブ化したファイルを展開する
:::

## scpコマンド(<font color="red">s</font>ecure <font color="red">c</font>o<font color="red">p</font>y)
・異なるサーバ間でファイルの送受信を行うためのコマンドです。

 ```:scpコマンド出力結果
 送信構文：scp [コピー元のローカルファイル] [リモートサーバユーザ]@[リモートサーバのIP or ホスト名]:[コピー先のディレクトリ]
受信構文：scp [リモートサーバユーザ]@[リモートサーバのIP or ホスト名]:[コピー元のファイル名] [コピー先のローカルディレクトリ] 

【送信シナリオ】
　現在ログインしているサーバ(ホスト名：localhost)から
　APサーバ(IP：10.172.10.0、ホスト名：APSV01、一般ユーザ：apuser)の/home/apuser配下に、test.txtを送信する

[user@localhost ~]$ scp test.txt apuser@APSR01:/home/apuser

【受信シナリオ】
　APサーバ(IP：10.172.10.0、ホスト名：APSV01、一般ユーザ：apuser)の/home/apuser配下のtest2.txtを
　現在ログインしているサーバ(ホスト名：localhost)の/home/user配下に受信する

[user@localhost ~]$ scp apuser@APSR01:/home/apuser/test.txt /home/user
``` 
|`オプション`    |`説明`|
|:----------:|--------------------------|
|*-p*  |秘密鍵のファイルを指定する|
|*-r*  |ディレクトリ内を再帰的にコピー|
|*-i 秘密鍵*  |文字数のみ表示|
|*-1*  |SSH1を使用する|
|*-2*  |SSH2を使用する|
|*-4*  |IPv4を使用する　|
|*-6*  |IPv6を使用する|
## ftpコマンド(<font color="red">f</font>ile <font color="red">t</font>ransfer <font color="red">p</font>rotocol)
・ファイルの送受信を **FTPモード** で行うコマンドです。`ftp`コマンド自体は **`FTP`(File Transfer Protocol)** といプロトコルを使用しており、FTPモードに切り替えるのみのコマンドです。

 ```:ftpコマンド出力結果
 構文：ftp [サーバのIP or ホスト名]

【APサーバ情報】
IP       ：10.172.10.0
ホスト名  ：APSV01
一般ユーザ：apuser
パスワード：apuser

[user@localhost ~]$ ftp APSV01
Connected to 10.172.10.0.
220 (vsFTPd 2.0.0)
Please specify the password.
Password:                             # ここにAPサーバのパスワードを入力する
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>                                  # コマンドのプロンプトが変わる
``` 
|`FTPコマンド`    |`説明`|
|:----------:|--------------------------|
|*ls*              |現在のディレクト内の一覧を表示|
|*cd [directory]*  |指定したディレクトリに移動|
|*get [file]*      |サーバから指定したファイルをローカルにダウンロード|
|*put [file]*      |ローカルからサーバに指定したファイルをアップロード|
|*delete [file]*   |サーバ上の指定したファイルを削除|
|*bye*             |FTPモードのセッションを終了|

:::note
**`/var/log/xferlog`ってなに？？**
:point_right:**FTP**で転送ログ情報が出力されるログファイルのこと
いつ誰にどのサイズのファイルを何秒で転送したかのログが残されます
:::

:::note
**今、どのサーバにいるの？？**
:bell:何かと使える **`hostname`** コマンドについて
自分が今どのサーバにログインしているかはコマンドプロンプトを見ればホスト名はわかりますが、`hostname`コマンドを使えば**IPアドレス**も表示することができます！
```:実行例
【APサーバ情報】
IP       ：10.172.10.0
ホスト名  ：APSV01

[user@localhost ~]$ hostname       # オプションなしはホスト名表示
APSV01
[user@localhost ~]$ hostname -I    # -IオプションはIPアドレス表示
10.172.10.0
```

:white_check_mark: オプションには **`-i`** と **`-I`** が存在しますが違いは以下です。 
|`オプション`    |`説明`|
|:----------:|--------------------------|
|*-i* |**DNS**や **/etc/hosts** によって名前解決してるホスト名のIPアドレス|
|*-I* |ネットワークに接続している **全てのIPアドレス**|

:point_right:**`/etc/hosts`** には、IPアドレスとホスト名の関係が記述されています。
:::

# その他のコマンド:star:
その他のコマンドを説明する前に以下を説明します。

:black_small_square:**標準入力・標準出力・標準エラー出力**
・Linuxコマンドは、**標準入力・標準出力・標準エラー出力**を処理するようにできています。
|`入出力名`    |`説明`|
|:----------:|--------------------------|
|**標準入力** |文字を入力しコマンドに渡す　例)キーボード|
|**標準出力** |コマンドやプログラムの実行結果をディスプレイに出力|
|**標準エラー出力** |コマンドやプログラムのエラーメッセージをディスプレイに出力|


:black_small_square:**リダイレクトとパイプの概要**
・コマンドの入出力をファイルに切り替える機能を **<font color="Red">リダイレクト `>`</font>** といい、コマンドの出力結果を別のコマンドの標準入力に渡す機能を **<font color="Red">パイプ `|`</font>** といいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2732985/9a01b62f-bc96-c389-68d6-3d0534cce0a4.png)
															
## リダイレクト
・通常、コマンドの入力をキーボードを使用して、そのコマンドの実行結果はディスプレイ上に表示されます。
しかし 、 **リダイレクト** を使用すれば、コマンドの事項結果を画面上に表示されるのではなくファイルに保存することができます。
|`リダイレクト`    |`説明`|
|:----------:|--------------------------|
|>    |コマンドの実行結果(標準出力)をリダイレクト(上書き)|
|>>   |コマンドの実行結果(標準出力)をファイルに追記|
|<    |入力のリダイレクト|
|<<   |入力終端文字の指定|
|2>   |コマンドの実行結果(エラー標準出力)をファイルに設定|
|2>&1 |コマンドの標準出力と標準エラー出力をファイルに設定|

:black_small_square:**具体的な使用例**
|`リダイレクト`    |`説明`|
|:-----------------------:|--------------------------|
|コマンド > ファイル      |コマンドの「標準出力」をファイルに書き込む|
|コマンド < ファイル      |ファイルの内容をコマンドの「標準入力」へ送る|
|コマンド >> ファイル     |コマンドの「標準出力」をファイルに追記|
|コマンド 2> ファイル     |ファイルに「エラー出力」を書き込む|
|コマンド 2>> ファイル    |ファイルに「エラー出力」を追記|
|コマンド > ファイル 2>&1 |ファイルに「標準出力」と「エラー出力」を書き込む|
|コマンド >> ファイル 2>&1|ファイルに「標準出力」と「エラー出力」を追記する|
|コマンド &> ファイル     |ファイルに「標準出力」と「エラー出力」を同じファイルに書き込む|
|コマンド << 終端文字     |終了文字が現れるまで「標準入力」へ送る|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2732985/92f4333e-3972-6197-bf46-59853951a130.png)

## パイプ
・コマンドの出力結果を別のコマンドの標準入力に渡すことができます。
`sort`コマンドで説明した例をつかって解説します。
```:実行例
[user@localhost ~]$ ls -l /home/user/log | sort -k 5 -n -r
-rw-rw-r--. 1 user user  500  1月 3 00:00 2025 test3.log
-rw-rw-r--. 1 user user  400  1月 4 00:00 2025 test4.log
-rw-rw-r--. 1 user user  300  1月 5 00:00 2025 test5.log
-rw-rw-r--. 1 user user  200  1月 2 00:00 2025 test2.log
-rw-rw-r--. 1 user user  100  1月 1 00:00 2025 test.log
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2732985/30303341-a0c7-6afc-1c66-6c2e7571f22b.png)
												
## teeコマンド
・標準入力から読み込んでファイルに書き込み、次のコマンドに実行結果を引き渡すコマンドです。
```:teeコマンド出力結果
[user@localhost ~]$ ls -l /home/user/log | tee totalLog.txt # ls -lの実行結果をファイルに出力して画面にも表示
-rw-rw-r-- 1 user user  500  1月 3 00:00 2025 test3.log
-rw-rw-r-- 1 user user  400  1月 4 00:00 2025 test4.log
-rw-rw-r-- 1 user user  300  1月 5 00:00 2025 test5.log
-rw-rw-r-- 1 user user  200  1月 2 00:00 2025 test2.log
-rw-rw-r-- 1 user user  100  1月 1 00:00 2025 test.log
[user@localhost ~]$ cat totalLog.txt                       # ls -l の実行結果がそのまま出力
-rw-rw-r-- 1 user user  500  1月 3 00:00 2025 test3.log
-rw-rw-r-- 1 user user  400  1月 4 00:00 2025 test4.log
-rw-rw-r-- 1 user user  300  1月 5 00:00 2025 test5.log
-rw-rw-r-- 1 user user  200  1月 2 00:00 2025 test2.log
-rw-rw-r-- 1 user user  100  1月 1 00:00 2025 test.log
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2732985/cd47d92d-ed49-6799-c670-fe52448649e3.png)

## echoコマンド
・指定した文字列や変数の値を出力することができるコマンドです。
 ```:echoコマンド出力結果
 構文：echo 文字列
 構文：echo $変数名
 
[user@localhost ~]$ echo $JAVA_HOME   # JAVA_HOMEという環境変数を出力する
/usr/java
```
:::note
**Tomcatが再起動しない** :interrobang:
:loudspeaker: :point_down:※**筆者の体験談です**:point_down:
筆者は、サーバの起動・停止を実施したことあるんですが、**Tomcatが正常に終了しない** という問題に直面しました。
Tomcatが起動しない原因は、**`/var/run/tomcat/tomcat.pid`** に保存されいる**PID**と、実際に起動している`tomcat`のサービスの**PID**が異なっていたからでした。
そのため、実際のPIDを`tomcat.pid`に上書きしないといけないので、その際に`echo`コマンドを使用していました。
```:tomcatのPIDを正規に変更する
[root@localhost ~]# ps -ef | grep tomcat           # まず実際のプロセスのPIDを調査
USER     PID    PPID  %CPU  START TTY  TIME COMMAND
tomcat 10000       1   0.1  10:00 ?    0:01 /usr/java/bin/java/･･･
[root@localhost ~]# cat /var/run/tomcat/tomcat.pid # ファイル内のPIDも確認
10001
[root@localhost ~]# echo 10000 > /var/run/tomcat/tomcat.pid
:::
# 検索関連コマンド :star::star:
## findコマンド
・指定したディレクトリ配下のファイルやディレクトリを検索するコマンドです。検索条件として正規表現を使ったり、検索結果のファイルやディレクトリに対して指定したコマンドを実行したりできます。
```:findコマンド出力結果
構文：find [検索ディレクトリ] [検索条件] [アクション]

[user@localhost ~]$ find /home/user/log -type f "*.log"  # 指定ディレクトリ配下のログファイルを検索
```
|`検索条件`    |`説明`|
|:----------:|--------------------------|
|*-type タイプ*    |ファイルタイプで検索<br>`f`：ファイル、`d`：ディレクトリ、`l`：シンボリックリンク|
|*-name 文字列*    |文字列を指定して検索|
|*-atime 日時*     |最終アクセス日で検索|
|*-mtime 日時*     |最終更新日で検索|
|*-perm アクセス権* |アクセス権(8進数 or パーミッション)で検索|
|*-size サイズ*    |ファイルサイズで検索|
|*-user ユーザ名*  |ファイルの所有者で検索|

:::note
**アクセス日時 :question: 更新日 :question:**
・**アクセス日時**：ファイルをアクセスされた(読み込まれた)時刻のこと
・**更新日**　　　：ファイルの中身が変更された時の時刻のこと
:point_right:上記のことから、ファイルを読み込んだだけの時の更新される日時を検索したい場合は **`-atime`**、ファイルに変更加えた時の更新される日時を検索したい場合は **`-mtime`** を使用します。
:::

## grepコマンド(<font color="red">g</font>lobal <font color="red">r</font>egular <font color="red">e</font>xpression <font color="red">p</font>rint)
・指定した文字列を含む行を出力するコマンドです。他のコマンドの標準出力をパイプで標準入力として受け取って、それに対して検索をかけることが多いかと思います。
<font color="red">g</font>lobal / <font color="red">r</font>egular <font color="red">e</font>xpression / <font color="red">p</font>rint
:point_right:ファイル全体から / 正規表現に一致する行を / 表示する
```:grepコマンド出力結果
構文：grep [オプション] 検索文字列 ファイル名

[user@localhost ~]$ cat test.txt | grep '正常終了'    # ファイルの中身から「正常終了」の文字列を含む行を表示
```
|`オプション`    |`説明`|
|:----------:|--------------------------|
|*-v*|パターンにマッチしない行を表示|
|*-f*|ファイルから検索パターンを読み込む|
|*-c*|パターンがマッチした行の行数だけ表示|
|*-i*|大文字小文字を区別しない|
|*-n*|検索結果と一緒に行番号も表示|
|*-E*|拡張正規表現を使用|
|*-F*|検索文字列を正規表現ではなく固定文字列として認識|

:warning:**`egrep`** や **`fgrep`** も存在しますが **`grep -E = egrep`**、**`grep -F = fgrep`** ですので、説明は割愛、気になる方は調べてみてください。

:::note
**`grep -v`の使いどころはどこ :question:**
`-v`はパターンにマッチしない行を表示となってますが、どういったときに使用するかというと、**実行したコマンド自体を表示させたくない場合**に使用するのが多いかなと思います。

```:使用例
[root@localhost ~]# ps -ef | grep tomcat                # オプション指定なし
USER     PID    PPID  %CPU  START TTY  TIME COMMAND
tomcat 10000       1   0.1  10:00 ?    0:01 /usr/java/bin/java/･･･
root     2200      1   0.0  10:20 ?    0:00 grep tomcat
⇒オプションなしの場合は、実行したコマンドのプロセスまで表示してしまい見にくくなります

[root@localhost ~]# ps -ef | grep tomcat | grep -v grep # オプション指定あり
USER     PID    PPID  %CPU  START TTY  TIME COMMAND
tomcat 10000       1   0.1  10:00 ?    0:01 /usr/java/bin/java/･･･
⇒tomcatを含むプロセスを表示後に、実行したgrepコマンド自身のプロセスを除外して表示
:::
## awkコマンド(<font color="red">A</font>ho <font color="red">W</font>einberger <font color="red">K</font>ernighan)
・テキストファイルを処理するコマンドです。
<font color="red">A</font>ho <font color="red">W</font>einberger <font color="red">K</font>ernighan
:point_right:Alfred Vaino Aho、Peter Jay Weinberger、Brian Wilson Kernighanの三名が命名
```:awkコマンド出力結果
構文：awk '[処理する条件]' [ファイル名]

[user@localhost ~]$ awk -F ',''{ print $3,$5}' test.csv  
# CSVファイルを,(カンマ)で区切り、ファイルの中身から第2、5フィールド目を表示させる
```
|`オプション`    |`説明`|
|:----------:|--------------------------|
|*-F* |フィールドの区切り文字を指定、デフォルトはスペースとタブ|

:::note
**ロングオプション :question: ショートオプション :question:**
:bell:ロングオプションは`--二文字以上`、ショートオプションは`-一文字`
普段使っているオプションたちは**省略可能なロングオプション**の可能性があります！
`awk`コマンドを例にとると、
```:オプション比較
[user@localhost ~]$ awk -F ',''{ print $3,$5}' test.csv  
[user@localhost ~]$ awk --field-sepatator ',''{ print $3,$5}' test.csv  
```
上記は、オプションが違うように見えますが、**全く同じ処理**をします。
ですが、省略形が存在するのにわざわざロングオプションを使用するのは、明示したいときや**ロングオプション**しかない場合に限られるかと思います。
:::

## sedコマンド(<font color="red">s</font>tream <font color="red">ed</font>itor)
・テキストに対して編集を行うコマンドです。
```:sedコマンド出力結果
構文：sed [オプション] -f スクリプト [ファイル]
構文：sed [オプション] コマンド [ファイル]
構文：sed [オプション] -e コマンド1 -e コマンド2 [ファイル]

[user@localhost ~]$ sed s/abc/ABC/ test.txt  # ファイルの「abc」を「ABC」に変換する
```
|`オプション`    |`説明`|
|:----------:|--------------------------|
|*-s* |パターンに元に置換<br>s/検索パターン/置換パターン と指定すると置換する|
|*-d* |マッチしタ行を削除する<br>"開始行,終了行d"と指定すると削除する|
|*-f ファイル* |コマンドが書かれたスクリプトファイルを指定|
|*-y* |文字の変換<br>y/検索文字/置換文字/ と指定すると置換する|

## whichコマンド
・指定したコマンドの格納されているディレクトリを検索して絶対パスを表示するコマンドです。
```:whichコマンド実行結果
[user@localhost ~]$ which systemctl  # systemctlコマンドを使用できるか確認
[user@localhost ~]$ echo $?          # 前のコマンドの終了ステータスを確認
1                                    # 「1」の場合は、コマンドが見つからなかったことを示す

[user@localhost ~]$ which ls         # lsコマンドを使用できるか確認
/bin/ls                              # 使用できる場合は絶対パスを表示する
```
# プロセス管理コマンド:star::star::star:
## psコマンド(<font color="red">p</font>rocess <font color="red">s</font>tatus)
・プロセス情報を確認するコマンドです。
:white_check_mark: **<font color="Red">プロセス</font>** とは:question:
:point_right:Linux上のプログラムを実行すると、そのプログラムにメモリが割り当てられて、CPUで処理され、動作中のプログラムはOSで管理されます。この管理する単位のことを **<font color="Red">プロセス</font>** といいます。
今までの説明の中にしれっと出てきましたが、それくらい結構使用頻度が高いコマンドです。
```:psコマンド実行結果
構文：ps [オプション]

[user@localhost ~]$ ps  # オプションなしだと、psコマンドを実行した端末で実行されているプロセスを表示
 PID TTY         TIME  CMD
4900 pts/0   00:00:00  ps
7892 pts/0   00:00:01  bash
```
|`オプション`    |`説明`|
|:----------:|--------------------------|
|*a*            |他のユーザの全てのプロセスを表示|
|*-e*           |全てのプロセスを表示|
|*f*            |プロセスの親子関係を表示|
|*u*            |プロセスのユーザ情報を表示|
|*x*            |端末を使用していない全てのプロセスを表示|
|*-l*           |プロセスの詳細情報を表示|
|*-p PID*       |指定したプロセスID(PID)の情報のみ表示|
|*-c プロセス名* |指定したプロセスのみ表示|
|*-w*           |長い行を折り返して表示|
```:オプション使用例
[root@localhost ~]# ps -ef | grep tomcat
USER     PID    PPID  %CPU  START TTY  TIME COMMAND
tomcat 10000       1   0.1  10:00 ?    0:01 /usr/java/bin/java/･･･
root    2200       1   0.0  10:20 ?    0:00 grep tomcat
```
:point_up:上記の `ps` コマンドの出力ラベルの説明は以下の通り
|`項目`    |`説明`|
|:----------:|--------------------------|
|**USER**   |プロセスを実行しているユーザ|
|**PID**    |プロセスID|
|**PPID**   |親プロセスのPID|
|**%CPU**   |CPU使用率|
|**START**  |プロセスの起動時刻|
|**TTY**    |プロセスを実行した端末|
|**TIME**   |消費したCPU使用率|
|**COMMAND**|実行コマンド or 実行プログラム名|

:warning: プロセス関連で `top`コマンドや `pstree`コマンドが存在しますが、そこまで専門的な業務ではなく全く使用したことがなかったので、ここではこんなコマンドもあるよ～ってだけに留めます。

## killコマンド
・`ps`コマンドではプロセスを確認しますが、`kill`コマンドではプロセスに対して**シグナル**を送り、プロセスを制御します。
|`シグナル名`|`シグナルID`|`説明`|
|:----------:|:----------:|--------------------------|
|*HUP*  |**1** |ハングアップ(端末との接続が切断)|
|*INT*  |**2** |キーボードからの割り込み|
|*QUIT* |**3** |キーボードからのプロセス中止|
|*KILL* |**9** |強制終了|
|*TERM* |**15**|通常終了|
|*CONT* |**18**|一時停止中のプロセスを再開|
|*STOP* |**19**|一時停止|
```:killコマンド実行結果
構文：kill -[シグナル名 or シグナルID] PID
構文：kill -s [シグナル名 or シグナルID] PID
構文：kill -SIGシグナル名 PID

【シナリオ】
・Tomcatを正常終了する。
⇒まずpsコマンドで、対象のプロセスを調べて、その後killコマンドで対象プロセスを正常終了する

[root@localhost ~]# ps -ef | grep tomcat
USER     PID    PPID  %CPU  START TTY  TIME COMMAND
tomcat 10000       1   0.1  10:00 ?    0:01 /usr/java/bin/java/･･･
root    2200       1   0.0  10:20 ?    0:00 grep tomcat
[root@localhost ~]# kill -TERM 10000
```
:white_check_mark::point_down: **以下の実行例は全て同じ処理です :bangbang:**:point_down:
```:killコマンドの構文は多いよね
[root@localhost ~]# kill -TERM 10000
[root@localhost ~]# kill -15 10000
[root@localhost ~]# kill -s TERM 10000
[root@localhost ~]# kill -s 15 10000
[root@localhost ~]# kill -SIGTERM 10000
```
:::note alert
:loudspeaker:**<font color="Red">強制終了(KILL,9)</font>の実行時は気を付けて:raised_hand:**
`kill`コマンドはプロセスのシグナルを送信できますが、取り扱いには注意です。
**強制終了**である**KILL**シグナルは、問答無用でプロセスを終了させてしまうため、ほんとにkillしていいプロセスなのか、killすることで他に影響はないか、事前に確認する必要があります。
:::
:warning: `kill`コマンドの他に`killall`というコマンドもありますが、ここでは省略いたします。

## ジョブ
・1つ以上のコマンドで動作するひとまとまりの処理単位のことです。パイプを使用して複数のコマンドを実行する場合もジョブとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2732985/371366aa-d8b9-091d-8b29-8dc23d1dba68.png)

:black_small_square: **フォアグラウンドジョブとバックグラウンドジョブ**
・ジョブには、通常実行される **フォアグラウンドジョブ** と、時間がかかる処理でもまたなくていい **バックグラウンドジョブ** に分かれます。
|`ジョブ`    |`説明`|
|:----------:|--------------------------|
|**フォアグラウンドジョブ**|ジョブ実行中、シェル(ターミナル画面)は停止する|
|**バックグラウンドジョブ**|ジョブがバックグランドで実行され、シェルは停止しない|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2732985/af2542f5-d135-131c-3178-736659d2302c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2732985/3c91b20f-a764-2d18-73e7-d81dedd640f0.png)

:white_check_mark:実行中のジョブは`jobs`で確認できます。
```:jobsコマンド出力結果
[user@localhost ~]$ jobs
[1]+ Runnning   ps -ef | grep dbora 
[2]- Stopped    service dbora reboot
```
|`項目`    |`説明`|
|:----------:|--------------------------|
|+ (Runnning)|現在実行中のジョブ|
|- (Stopped)|一時停止中のジョブ|

:black_small_square: **フォアグラウンドジョブとバックグラウンドジョブの制御**
・実行する際にバックグランドで実行指定することもできますが、実行中のジョブをバックグラウンドに変更したり、バックグラウンドで実行しているジョブをフォアグラウンドに変更したりすることもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2732985/a99539ce-8d82-4f85-bc0a-62e248fbd279.png)

|`ジョブ制御`    |`説明`|
|:----------:|--------------------------|
|*$コマンド &*|コマンドをバックグラウンドで実行|
|*Ctrl + Z*  |フォアグラウンドを、バックグラウンドの停止状態へ移行|
|*Ctrl + C*  |フォアグラウンドのジョブを強制終了|
|*bg*        |バックグラウンドで停止中のジョブを実行状態にする|
|*fg*        |バックグラウンドをフォアグランドに変更する|

# Linuxファイルシステム関連コマンド:star::star::star:
## dfコマンド(<font color="red">d</font>isk <font color="red">f</font>ree)
・ファイルシステムの空き状況を確認するコマンドです。
```:dfコマンド出力結果
構文：df [オプション] [デバイス名/ディレクトリ]

[user@localhost ~]$ df -h       # ファイルシステムの使用状況を単位で表示

Filesystem        Size  Used  Free  Use%  Mount on
/dev/sda1          20G    2G   18G   10%  /
tmpfs             500M   20K  500M    1%  /dev/shm    
```
|`オプション`    |`説明`|
|:----------:|--------------------------|
|*-h*|容量を単位(MBやGB)で表示|
|*-k*|容量をKB単位で表示|
|*-m*|容量をMB単位で表示|
|*-i*|inodeの使用状況を表示|

## duコマンド(<font color="red">d</font>isk <font color="red">u</font>sed)
・ディレクトリやファイルの容量を表示するコマンドです。
引数になにも指定しない場合、カレントディレクトリを対象として表示します。
```:duコマンド出力結果
構文：du [オプション] [デバイス名/ディレクトリ]

[user@localhost ~]$ du -h    # ファイルシステムの使用量を単位で表示
10M     .           # カレントディレクトリの使用量
8.0k    ./http      # httpサービスの使用量
```

|`オプション`    |`説明`|
|:----------:|--------------------------|
|*-h*|容量を単位(MBやGB)で表示|
|*-k*|容量をKB単位で表示|
|*-m*|容量をMB単位で表示|
|*-a*|ディレクトリだけでなく、ファイル容量も表示|
|*-c*|合計容量も同時に表示|

:black_small_square: **`df`コマンドと`du`コマンドの違い**

|`コマンド`|`意味`|`説明`|
|:----------:|:----------:|--------------------------|
|*df*|Disk Free|ファイルシステムの空き容量を表示|
|*du*|Dick Used|ディレクトリ内のファイルが使用している容量を表示|

## freeコマンド
・システム内のメモリ状況を確認できるコマンドです。
```:freeコマンド出力結果
構文：free [オプション]

[root@localhost ~]# free -m     # 使用状況を確認
           total     used      free      shared    budd/cache     available
Mem:       15940     5000       940        2000          8000          7000
Swap:        900      400       800
```

:black_small_square: **項目の説明**
|`項目`|`説明`|
|:----------:|--------------------------|
|*total*     |合計メモリ量|
|*used*      |メモリ使用量(実際にプロセスで使用されているメモリ量)|
|*free*      |未使用のメモリ量|
|*shared*    |共有メモリで使用しているメモリ量|
|*buff/cache*|バッファ+キャッシュメモリに使用されているメモリ量|
|*available* |プロセスが利用できるメモリ量|

## vmstat(<font color="red">v</font>irtual <font color="red">m</font>emory <font color="red">stat</font>istics)
・CPU使用率を取得するコマンドです。

```:vmstatコマンド出力結果

[user@localhost ~]$ vmstat
procs -----------memory----------- ---swap--- -----io---- -system-- ------cpu-----
 r  b  swpd   free    buff   cache   si   so     bi    bo   in   cs us sy id wa st
 3  0     0 426200    1200  780000    0    0      4     2   85  156  1  0 99  0  0
```
:point_right: **CPU使用率も算出する方法**
・上記のコマンド結果の「cpu」の項目（us、sy、id、wa、st）を足すと`100`になります。
**CPU使用率 (%) = 100 - idの値**
このコマンドは、**CPU使用率** を算出する目的で使用していたため、注目する項目は以下だけでもいいと思います。
<table>
  <thead>
    <tr>
      <th>項目1</th>
      <th>項目2</th>
      <th>説明</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th rowspan="5">cpu</th>
      <th>us</th>
      <td>カーネルコード以外の実行に使用した時間(%)</td>
    </tr>
    <tr>
      <th>sy</th>
      <td>カーネルコードの実行に使用時間(%)</td>
    </tr>
    <tr>
      <th>id</th>
      <td>アイドル時間(%)</td>
    </tr>
    <tr>
      <th>wa</th>
      <td>IO待ち時間(%)</td>
    </tr>
    <tr>
      <th>st</th>
      <td>仮想マシンから盗まれた時間(%)</td>
    </tr>
  </tbody>
</table>


## パーミッション:star:
・Linuxで作成されるファイルやディレクトリには **<font color="red">パーミッション</font>** (アクセス権)が設定されます。
このパーミッションを使用することで、ユーザごとにファイルへのアクセスを許可したり禁止したりできます。
`ls -l `コマンドを実行した際に、先頭にある **`r`** **`w`** **`x`** で構成されているのがパーミッションです。
```:パーミッション確認
[user@localhost ~]$ ls -ltr /home/user
-rw-rw-r-- 1 user user  100  1月 1 00:00 2025 test.txt
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2732985/e74ebec8-8118-df93-2bf8-c76ba21b00d4.png)
:black_small_square: **ファイルへのアクセス権限**
|`アクセス権`|`表記`|`説明`|
|:----------:|:----------:|--------------------------|
|**読み取り**| **`r`**|read、ファイルの読み取りが可能(内容表示)|
|**書き込み**| **`w`**|write、ファイルへの書き込みが可能(編集、上書きコピー)|
|**実行**    | **`x`**|execute、ファイルの実行が可能(シェルスクリプトの実行)|

:black_small_square: **ディレクトリへのアクセス権限**
|`アクセス権`|`表記`|`説明`|
|:----------:|:----------:|--------------------------|
|**読み取り**| **`r`**|read、ディレクトリの読み取りが可能<br>(ディレクトリに登録されているファイル名の表示)|
|**書き込み**| **`w`**|write、ディレクトリへの書き込みが可能<br>(新規ファイル作成、削除、名前変更など)|
|**実行**    | **`x`**|execute、ディレクトリに存在するファイルへのアクセスが可能|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2732985/cca8678c-8305-382d-37ac-6c014975c7c2.png)

:black_small_square: **通常ファイル・ディレクトリ・シンボリックリンク**
|`ファイルの種類`|`説明`|
|:----------:|--------------------------|
| **`-`**|通常ファイル|
| **`d`**|ディレクトリ|
| **`l`**|シンボリックリンク|

:white_check_mark: **パーミッションは8進数で扱うことが多い** :bangbang:
:point_right:パーミッションをいちいち記号で表すと扱いにくいので、以下のように8進数でパーミッションを付与したり、制限したりします。


|`記号表記`|`8進数`|
|:----------:|:----------:|
|**`---`**|        **`0`**        |
|**`--x`**|        **`1`**        |
|**`-w-`**|        **`2`**        |
|**`-wx`**|        **`3`**        |
|**`r--`**|        **`4`**        |
|**`r-x`**|        **`5`**        |
|**`rw-`**|        **`6`**        |
|**`rwx`**|        **`7`**        |

上記から、パーミッション「rwx-rw-rw-」の場合は、8進数で「**755**」となります。

## chmodコマンド(<font color="red">ch</font>ange <font color="red">mod</font>e)
・パーミッション（アクセス権）を変更することができるコマンドです。パーミッションを指定する場合は、上記で説明したとおり8進数での指定が一般的です。
```:chmodコマンド出力結果
構文：chmod [オプション] アクセス権 ファイル名

[root@localhost ~]# chmod 744 test.txt   # ファイルのパーミッションを744に変更
```
|`オプション`    |`説明`|
|:----------:|--------------------------|
|*-R*|指定したディレクトリ以下の全てのファイルのパーミッションを変更|


:black_small_square: **8進数以外の記号での設定**

:::note warn
:loudspeaker: **8進数以外のパーミッションの指定について**
・8進数以外でパーミッションを変更することができますが、業務一年で使用したことはないので、紹介はしますが細かい説明は省略いたします。
なお、 **LPIC-1** を受ける方は、ここも範囲ですので[パーミッションについて](https://www.infraexpert.com/infra/linux01.html)と[SUID・SGID・スティッキービットについて](https://www.infraexpert.com/infra/linux31.html)をご参照ください。
:::

|`カテゴリー`|`説明`|
|:----------:|:----------:|
|`u`|所有者|
|`g`|グループ|
|`o`|その他のユーザ|
|`a`|すべてのユーザ|
<br>

|`定義`|`説明`|
|:----------:|:----------:|
|`+`|パーミッションの追加|
|`-`|パーミッションの削除|
|`=`|パーミッションの指定|

<br>

|`権限`|`説明`|
|:----------:|:----------:|
|`r`|読み取り権限|
|`w`|書き込み権限|
|`x`|実行権限|
|`s`|SUIDまたはSGID|
|`t`|スティッキービット|

## chownコマンド(<font color="red">ch</font>ange <font color="red">own</font>er)
・ファイルやディレクトリの所有者を変更するコマンドです。このコマンドは、root権限のユーザのみ実行できます。
```:chownコマンド出力結果
構文：chown[オプション] ユーザ[:グループ] ファイル名 or ディレクトリ名

[root@localhost ~]# chown root test.txt   # ファイルの所有者をrootに変更
```
|`オプション`    |`説明`|
|:----------:|--------------------------|
|*-R*|指定したディレクトリ以下の全てのファイルの所有者を変更|

## diffコマンド(<font color="red">diff</font>erence)
・ファイルやディレクトリの内容を比較し、違いを表示するコマンドです。
```:diffコマンド出力結果
構文：diff [オプション] ファイル名1 ファイル名2 

【シナリオ】
・test.txtに「abc」、test2.txtに「def」が書き込まれているファイルがある

[user@localhost ~]$ diff test.txt test2.txt
1c1
< abc
---
> edf
```

## lnコマンド(<font color="red">l</font>i<font color="red">n</font>k)
・シンボリックリンクを作成するコマンドです。オプションを指定しない場合はハードリンクが作成される。
```:lnコマンド出力結果
構文：ln [オプション] リンク元 リンク先

[root@localhost ~]# ln -s test.txt test.lnk   # test.txtのシンボリックリンクとしてtest.lnkを作成
[root@localhost ~]# ls -l
lrwxrwxrwx 1 user user  100  1月 1 00:00 2025 test.lnk -> test.txt
-rw-rw-r-- 1 user user  100  1月 1 00:00 2025 test.txt
```

|`オプション`    |`説明`|
|:----------:|--------------------------|
|*-s*|シンボリックリンクを作成する際に指定する|

:black_small_square: **シンボリックリンクとハードリンク**
・ファイルの実体とファイル名をつなぐ事を**リンク**といい、リンクには以下の2種類があります。
※ファイルの実体とは、ディスク上に保存されているデータのこと

|`リンク`    |`説明`|
|:----------------:|--------------------------|
|**シンボリックリンク**|Windowsのショートカットに該当、<br>リンク元が配置されている場所にリンクする方式|
|**ハードリンク**      |1つのファイルの実体を複数のファイル名で表せるリンク、<br>同じファイルの実体を共有する方式|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2732985/09c94db6-cc5b-e785-82ec-0666e991c73f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2732985/7f41227b-19b1-e449-1bce-10f7ef77a22f.png)

# サービス管理コマンド:star::star::star:
## serviceコマンド
・サービスを起動したり停止したりするコマンドです。
```:serviceコマンド出力結果
構文：service サービス名 操作

[root@localhost ~]$ service tomcat status
tomcat (pid  4400) is runnning...
```
|`操作`    |`説明`|
|:----------:|--------------------------|
|**start**  |サービスを起動|
|**stop**   |サービスを停止|
|**restart**|サービスを再起動|
|**status** |サービスの状態を表示|

## systemctlコマンド
・サービスを起動したり停止したりするコマンドです。基本的に`service`コマンドと使い方の違いはほとんどありません。
```:systemctlコマンド出力結果
構文：systemctl  操作 サービス名

[root@localhost ~]$ systemctl status tomcat
tomcat (pid  4400) is runnning...
```
|`操作`    |`説明`|
|:----------:|--------------------------|
|**start**  |サービスを起動|
|**stop**   |サービスを停止|
|**restart**|サービスを再起動|
|**reload** |サービスの再読み込み|
|**status** |サービスの状態を表示|

:::note
**`restart`(サービス再起動)と`reload`(設定再読み込み)の違いとは** :interrobang:
                                                                                    :point_right:**<font color="red">失敗したときの挙動が異なる</font>**
再起動で失敗する場合、停止して成功して起動が失敗するので、正しく起動するまでの間はサービス停止が発生します。
しかし、再読み込みで失敗した場合は、停止をしていないので設定前の状態で起動し続けることができます。
どうしても、サービスを停止したくないときには再読み込みするのがいいでしょう。
:::

## chkconfigコマンド(<font color="red">config</font>uration state <font color="red">ch</font>ec<font color="red">k</font>er)
・Linuxがシステム起動時に起動するサービスの一覧を表示したり、サービスの登録、削除、サービスの起動をランレベルごとに細かく設定できるコマンドです。コマンドを使用するにはroot権限が必要です。
自分は、一年間でこのコマンドを、サービス一覧表示以外に使用したことがありませんので、細かい説明は`--list`オプションのみにします。
```:chkconfigコマンド出力結果
構文：chkconfig [オプション] [サービス名]

[root@localhost ~]# chkconfig --list
crond        0:off  1:off   2:on   3:on   4:on   5:on   6:off
httpd        0:off  1:off   2:on   3:on   4:on   5:on   6:off 
mysqld       0:off  1:off   2:off  3:off  4:off  5:off  6:off 
```
|`オプション`    |`説明`|
|:----------:|--------------------------|
|*--list*　                      |サービスの一覧を表示|
|*--add*                         |サービスの登録|
|*--del*                         |サービスの削除|
|*--h*                           |コマンドのヘルプを表示する|
|*--v*                           |コマンドのバージョンを表示する|
|*--level* [ランレベル] サービス名|ランレベル毎にサービスのon/offを設定|

:black_small_square: **ランレベル**
・onとoffの前についてる0～6の数字のこと、以下の状態を表す。

|`Run Level` |`状態`|
|:----------:|--------------------------|
|**0**  |システムの停止|
|**1**  |シングルユーザモード|
|**2**  |マルチユーザモード|
|**3**  |マルチユーザモード|
|**4**  |未使用|
|**5**  |マルチユーザモード|
|**6**  |再起動|

:::note
**ランレベルはディストリビューションによって違う** :interrobang:
・上記で紹介しているランレベルは、`Red Hat Enterprise Linux`、`CentOS`、`Fedora`での状態です。
他の`Ubunts`などの状態は、ランレベル`4`がマルチユーザモードである、とかの違いがあります。
:::

# スケジュール管理コマンド:star::star:
## crontabコマンド
・`cron`のスケジュールを編集するコマンドです。スケジュールの管理をしているのは、`crond`というデーモンです。また、`cron`は全てのユーザが使用できます。
:point_right:[cronとはなんぞや](https://qiita.com/Tun/items/300c152ebdbe31d8ca91)でクーロンについて説明していますので、わからない方はご参照ください

```:crontabコマンド出力結果
構文：crontab [オプション]

[user@localhost ~]$ crontab -l   # userユーザに設定されているクーロンを確認
0 0 * * * /home/user/bin/test.sh
```

|`オプション`    |`説明`|
|:----------:|--------------------------|
|*-e*       |viエディタなどでcrontabファイルを編集|
|*-l*       |crontabファイルの内容を表示|
|*-r*       |crontabファイルの削除|
|*-i*       |crontabファイル削除時の確認|
|*-u ユーザ*|ユーザを指定してcrontabファイルの編集(rootユーザのみ使用可能)|

:::note
**`crontabファイル`の直接編集は禁止** :interrobang:
・crontabファイルは、普通のテキストに設定を記述して、 **`crontab 編集したテキスト`** で`/var/spool/cron`配下の実体に反映することができます。
```:実行例
[シナリオ]
・/home/user/crontab/user_crontabに「0 0 * * * /home/user/bin/test.sh」を
追記して、コマンドで実体に反映する

[user@localhost ~]$ cat /home/user/crontab/user_crontab    # 編集したファイル内容の確認
0 0 * * * /home/user/bin/test.sh
[user@localhost ~]$ crotnab -l                             # 現在のcronの設定
※何も設定なし
[user@localhost ~]$ su -                                   # root権限ユーザに切り替え
[root@localhost ~]# cat /var/spool/cron/user               # 念のため実体も確認
※何も設定なし
[root@localhost ~]# exit                                   # rootログアウト
[user@localhost ~]$ crontab /home/user/crontab/user_crontab # cron設定の反映
[user@localhost ~]$ crontab -l                             # cronが設定されていることの確認
0 0 * * * /home/user/bin/test.sh
```
:point_right:なるべく実体を直接編集すると、テスト用で反映させたいときには不便です。
一旦、ローカルのファイルを編集して、現在設定しているcrontabファイルをバックアップして、その後、編集した内容を反映させれば、戻すのも簡単ですし差分もわかりやすく管理しやすいと思います。（多分・・・）
:::

# サーバ時間管理コマンド:star:
:black_small_square: **ハードウェアクロックとシステムクロック**
・Linuxには、 ハードウェアとして内蔵されている **<font color="red">ハードウェアクロック</font>** と、メモリ上で動作する **<font color="red">システムクロック</font>** が存在します。
`date`コマンドは、システムクロックを参照して現在の日時を表示します。

:point_right: **システムクロックとハードウェアの修正**
・システムクロックを修正するには、 `date`コマンドで以下の書式に従って設定を行います。

|`書式`|**MM**|**DD**|**hh**|**mm**|**CC**|**YY**|**SS**|
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
|`意味`|月|日|時|分|西暦上二桁|西暦下二桁|秒|

## hwclockコマンド(<font color="red">h</font>ard<font color="red">w</font>are <font color="red">clock</font>)
・ハードウェアクロックを修正するコマンドです。

```:hwclockコマンド出力結果
構文：hwclock [オプション]

[root@localhost ~]# hwclock -w   # システムクロックの時刻をハードウェアクロックに反映
```

|`オプション`    |`説明`|
|:----------:|--------------------------|
|*-r*           |ハードウェアクロックを表示|
|*-s(--hctosys)*|ハードウェアクロックの時刻をシステムクロックに反映|
|*-w(--systohc)*|システムクロックの時刻をハードウェアクロックに反映|


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2732985/749ebee3-019e-082c-c867-5871a007ba34.png)

:black_small_square: **NTPによる時刻設定**
・ハードウェアクロック、システムクロックともに完全に正確な時刻とは限りません。正確な時刻を取得するためにはインターネットなどのクロック同期を行うプロトコルである **<font color="red">NTP</font>** (Network Time Protocol)を使用します。
NTPサーバは、一般向けに公開されたものを利用できますが、組織内で構築してNTPサーバとして利用することもできます。NTPサーバの設定は、 **`/etc/ntp.conf`** で行います。
また、NTPサーバの時刻を取得をするためには **`ntpdate -q`** コマンドを使用することで取得できます。


# ネットワーク関連コマンド:star::star::star:
## ポート番号
・TCP/IP通信において、コンピュータが通信に使用するプログラムを識別するための番号です。
以下が主なポート番号です。
|`ポート番号`|`プロトコル`|`サービス`|`説明`|
|:----------:|:----------:|:----------:|--------------------------|
|**20** |*TCP*    |*FTP*   |FTP：データ転送|
|**21** |*TCP/UDP*|*FTP*   |FTP：制御情報|
|**22** |*TCP*    |*ssh*   |ssh接続|
|**23** |*TCP*    |*telnet*|telnet接続|
|**25** |*TCP/UDP*|*SMTP*  |電子メール(送信)|
|**53** |*TCP/UDP*|*DNS*   |名前解決|
|**80** |*TCP*    |*HTTP*  |Web接続|
|**110**|*TCP*    |*POP3*  |電子メール(受信)|
|**143**|*TCP*    |*IMAP*  |電子メール(受信)|
|**161**|*UDP*    |*SNMP*  |ネットワーク監視|
|**443**|*TCP*    |*HTTPS* |SSLによるHTTP接続|
|**465**|*TCP*    |*SMTPS* |SSLによるSMTP接続|
|**993**|*TCP*    |*IMAPS* |SSLによるIMAP接続|
|**995**|*TCP*    |*POP3S* |SSLによるPOP接続|

:black_small_square: **TCPとUDPとは**
・**TCP**と**UDP**とは、IPなどと同様にインターネットにて標準的に利用されているプロトコルです。
**<font color="red">TCP</font>(Transmission Control Protocol)**
:point_right: **信頼性の高い通信を実現** するために使用されるプロトコル
**<font color="red">UDP</font>(User Datagram Protocol)**
:point_right: **信頼性が高くないが、速さやリアルタイム性を求める通信に使用** するために使用されるプロトコル

:black_small_square: **TCPとUDPの比較**
|`プロトコル`|`TCP`|`UDP`|
|:----------:|:----------|:----------|
|`通信方式`       |*コネクション型*|*コネクションレス型*|
|`信頼性`         |*高い*|*低い*|
|`転送速度`       |*低速*|*高速*|
|`上位のプロトコル`|*HTTP、Telnet、FTP、POP･･･*|*DNS、NTP、DHCP、SNMP･･･*|
|`主な用途`       |Webの閲覧、メールの送受信、<br>ファイル転送|音声通話、マルチキャスト通信、<br>ブロードキャスト通信|
|`主な特徴`       |・ポート番号を利用した上位プロトコルへのデータの受け渡し<br>・コネクションの確立、維持、切断<br>・順序制御、再送制御、ウィンドウ制御、フロー制御|・ポート番号を利用した上位プロトコルへのデータの橋渡し<br>・オーバヘッドが少ない<br>・信頼性がない|

## pingコマンド(<font color="red">p</font>acket <font color="red">in</font>ternet <font color="red">g</font>roper)
・ネットワーク上のホストが起動しているがどうか、IP通信ができるかどうかを調査したい場合に使用するコマンドです。
```:pingコマンド出力結果
構文：ping [オプション]

[root@localhost ~]# ping 10.172.10.0   # 指定したサーバが生きているか確認
64 bytes from 10.172.10.0:icmp_seq=1 ttl=128 time=0.998 ms
```
|`オプション`    |`説明`|
|:----------:|--------------------------|
|*-c 回数*|パケットを送信する回数を指定|
|*i 秒*   |パケットの送信間隔を秒単位で指定|

:black_small_square: **ホスト名とIPアドレス**
・ホスト名とIPアドレスの名前解決は、 **`/etc/hosts`** ファイルで設定します。名前解決は通常DNSサーバで行いますが、小規模のネットワークでは`/etc/hosts`を作成して、全てのクライアント(サーバ)に配布することでネットワーク上のホスト名からIPアドレスを紐づけられて通信できます。しかし、変更が発生した場合、配布しているサーバに対して再配布して書き換える必要があるため、運用上問題があります。
・また、名前解決(ホスト名とIPアドレスを相互に交換する仕組み)の問い合わせを行う順番について、**`/etc/nsswitch.conf`**ファイルで定義します。Linuxでの名前解決には、以下の方法があります。

:small_blue_diamond: /etc/hostsファイルでの問い合わせ(files)
:small_blue_diamond: LDAPサーバへの問い合わせ(ldap)
:small_blue_diamond: DNSサーバへの問い合わせ(dns)

上記の順番で名前解決するように設定されていることが多いです。

# まとめ
・エンジニア1年を通して使用したLinuxコマンドを紹介してきました。もちろん、思い出せないコマンドや、使用していたけど忘れてしまったコマンドもありますが、結構網羅してると思います。思い出したり、使用したコマンドが増えたりした場合は追記したいと思います。
また、間違いがありましたがご教授お願いいたします。

# 参考
・[LinuCイージス](https://www.infraexpert.com/infra/study10.html)
・[新しいLinuxの教科書](https://www.amazon.co.jp/%E6%96%B0%E3%81%97%E3%81%84Linux%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E4%B8%89%E5%AE%85-%E8%8B%B1%E6%98%8E/dp/4797380942/ref=sr_1_2?adgrpid=116645880438&dib=eyJ2IjoiMSJ9.H0o-l65QT2xfsM4BejPGVN2iPkukYYX8GXJbMAZJXUZfTk6K72iGAuvvJGzi9aPWmUo8COIWsw-cAz2CYQngvYOGDW-U2F24NaliQfVeGhG6PILAgwmWrXjgkiaABqbX73x_im87eHE0s9S2BxQBRw7QJFtPg86Iws8DoR1paRD1vD1zwIqAQx0QTz8zbuI73F-gEuGqaTEdhp5x6Zf7oXrlhqCiqJMkkKxwvMU3tdTVa8xdM-L4e1KZU2FKsJf3l_MJFNq-1I81UxmVJlfhMqPqonmgAaxop3dHwJbouxOTjhchHNB-Rf7ZxR7QlhDrHg-9JQqkrMBhVjdi38SAvF04Z_aAvLw3HdKEpX7fgXgRSbdkSXJZGX1T7uxJJg1acxqAZIDtiPt7bDvAK1nIvFczaunwvqfbtPMpwRsCLkvTZyWf03titVXETKdKLuOP._mq3NG0e-UfWC2eo2Yy9k93g6SlBG45jScYLKxsgFHY&dib_tag=se&hvadid=678980112675&hvdev=c&hvqmt=b&hvtargid=kwd-314105638042&hydadcr=27267_14738185&jp-ad-ap=0&keywords=%E6%96%B0%E3%81%97%E3%81%84+linux+%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8&mcid=2e8ab2659fb63ddc8c597698e603270c&qid=1737332598&sr=8-2)