Linuxの基本コマンド

## はじめに
今回は  [もう怖くないLinuxコマンド。手を動かしながらLinuxコマンドラインを5日間で身に付けよう | Udemy](https://www.udemy.com/course/unscared_linux/)と
[Linux標準教科書](https://linuc.org/textbooks/linux/)を学習したので、Linuxの基礎コマンドについて簡単にまとめていこうと思います。

## Linuxとは？？
OSの一種で、コンピューターを動かすための基本のソフトのこと。
サーバー、組み込み、デスクトップといった幅広い用途で使われています。　　
オープンソースなので誰でも自由に使えます。

#### カーネルとディスとリビュージョン
カーネルはOSの中核（人格）となるソフトウェアのこと。
ディストリビューションはカーネルにいろいろなソフトウェアを組み合わせて使いやすくしたもの。
ディストリビューションは1000種類以上ある。

#### シェル
シェルとはLinuxのCLI(Command Line Interface)を提供するソフトウェアのこと。　　
ユーザーとLinuxカーネルの仲介役をしている。
ターミナルは入出力の画面を提供するソフトウェアのことなのでターミナルとシェルは別物。
ターミナルの中でシェルが動いているイメージです。

:::note info
CILとは、キーボードからコマンドを入力して、文字列として結果を出力するインターフェースのこと。
:::

**シェルの仕組み**
コマンドを入力すると実行結果が出力される
1. ユーザーがプロンプトにコマンドを打つ
2. シェルが入力された名前のコマンドを探す
3. Linuxカーネルが見つかったコマンドを実行する
4. シェルが実行結果を画面に表示する

:::note info
ユーザーが打ち込む場所としてコンピュータが表示してくれる場所をプロンプト（＄）という。　　
`$`は入力しなくて良い。
:::

#### ディレクトリ
ディレクトリはファイルが保存されている場所のこと。　　
WindowsやMacのフォルダと同じ概念

:::note info
ディレクトリは入れ子構造になっている
:::

入れ子構造ってどんなの？？って自分が思ったのでわかりやすく図で表してみました。
![image0 (1).jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3335067/fd07a411-210c-0bfb-4e09-1ac3342b8499.jpeg)

また/(ルート)ディレクトリを頂点とした階層構造のことを
**ディレクトリーツリー**と呼ぶ。

ディレクトリーツリーはこんな感じです。
![スクリーンショット 2023-06-16 130353.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3335067/80ea6c1e-6b2c-8bf0-8ede-64eabde5e720.png)



## Linuxの基礎コマンド
上部ではLinuxとはどんなものか簡単にまとめました。
ここからはLinuxを実際に使うときの基礎コマンドを紹介していきたいと思います。


### cd
ディレクトリを移動するコマンド
```
$ cd [ディレクトリ]

# 例
$ cd /home/kumi/
```
<table>
    <thead>
        <tr>
            <th>ディレクトリ</th>
            <th>意味</th>
            <th>指定方法</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>カレントディレクトリ</td>
            <td>現在自分がいるディレクトリ</td>
            <td>「.」</td>
        </tr>
        <tr>
            <td>親ディレクトリ</td>
            <td>1つ上の階層のディレクトリ</td>
            <td>「..」</td>
        </tr>
        <tr>
            <td>ホームディレクトリ</td>
            <td>「/home/ユーザー名」ディレクトリ</td>
            <td>「~」</td>
        </tr>
        <tr>
            <td>ルートディレクトリ</td>
            <td>「/」ディレクトリ</td>
            <td>「/」</td>
        </tr>
    </tbody>
</table>


### pwd
カレントディレクトリ（現在自分がいるディレクトリ）を表示するコマンド

```
$ pwd
```

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

```
$ ls [オプション][ディレクトリ・ファイル名]

#　例
$ ls /
bin dev home lib64 mnt
```

**よく使うオプション**

:::note info
オプションとはオプションを付けることでコマンドの動作を変えることができるもの。
:::

```
# 「.」で始まる隠しファイル等もすべて表示する
$ ls -a

# 長形式でファイルの詳細情報の表示をする
$ ls -l

# ファイル種別を表示する
$ ls -F
```
オプションは2つ以上指定したりオプションと子マンんどの引数を同時に指定したりできる
```
# 例
# オプションの複数指定(※下記の二種類は同じ意味になる）
$ ls -a -l
$ ls -al

# オプションとコマンドの引き数を同時に指定
$ ls -al /
```

**便利なパス名展開**
パス名展開を使うと複数のファイルを一度に指定できる
<table>
　<caption>パス名展開</caption>
    <thead>
        <tr>
            <th>記号</th>
            <th>意味</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>*</td>
            <td>任意の文字列</td>
        </tr>
        <tr>
            <td>?</td>
            <td>任意の一文字</td>
        </tr>
    </tbody>
</table>

```
# 例
# 拡張子がhtmlのファイルの一覧を表示
$ ls *.html
index.html home.html job.thml

# zから始まり4文字で終わるファイルを表示
$ ls /bin/z???
/bin/zcat /bin/zcmp /bin/znew
```
### mkdir
ディレクトリを作成するコマンド

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

# 例
# codeディレクトリを作成する
$ mkdir code
```
**よく使うオプション**

```
# 深いディレクトリを一度に作成する
$ mkdir -p test/2023/06
```
オプションを付けないと。。。
```
$ mkdir test
$ mkdir test/2023
$ mkdir test/2023/06
```
上記のように3回に分けてディレクトリを作成しなくてはいけないのでオプションを付けると効率よくディレクトリを作成できる！！

### rmdir
空のディレクトリを削除するコマンド

```
$ rmdir <ディレクトリ名>

# 例
# codeディレクトリを削除する
$ rmdir code
```
:::note info
空でないディレクトリを削除しようとするとエラーになるので中にファイルが残っていることに気が付かずにディレクトリを削除してしまうことを防ぐことができる。
:::

### cat
ファイルの中身を表示するコマンド

```
$ cat [オプション]<ファイル名>

# 例
$ cat /etc/hosts
```
**よく使うオプション**
```
# ファイルの詳細情報を表示
$ cat -n <ファイル名>

# 一度に複数のファイルを指定するとファイルの内容が順に表示される
$ cat <ファイル名> <ファイル名>
```
### less
長いファイルの中身をスクロール表示するコマンド
```
$ less <ファイル名>

# 例
$ less /etc/vimrc
```
<table>
　<caption>スクロールの操作方法</caption>
    <thead>
        <tr>
            <th>コマンド</th>
            <th>内容</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>スペースキー、ｆ</td>
            <td>1画面下にスクロール</td>
        </tr>
        <tr>
            <td>b</td>
            <td>1画面上にスクロール</td>
        </tr>
           <tr>
            <td>j</td>
            <td>1行下にスク11ール</td>
        </tr>
         <tr>
            <td>k</td>
            <td>1行上にスクロール</td>
        </tr>
        <tr>
            <td>q</td>
            <td>lessコマンドを終了</td>
        </tr>
    </tbody>
</table>

### tail
ファイルの終わり部分を表示するコマンド
標準だと終わりから10行表示する

```
$ tail[オプション]<ファイル名>

# 例
$ tail /etc/vimrc
```

**よく使うオプション**
```
# 末尾から指定した行を表示する
$ tail -n <行>
```

### touch
空のファイルを作成するコマンド

:::note info
実際にはファイルのタイムスタンプの変更をするコマンドだが、
ファイルが存在しないときに中身が空のファイルを作成できる。
:::

```
$ touch <新規ファイル名1> <新規ファイル名2> ...

# 例
$ touch README.md
```

### rm
ファイル・ディレクトリを削除するコマンド

:::note info
rmコマンドを実行すると、ゴミ箱ではなく完全に削除されてしまうので削除する際は注意が必要。
:::

```
$ rm [オプション] <削除するファイル1> <削除するファイル2>　...

# 例
$ rm README.md
```
**よく使うオプション**
```
# ディレクトリも合わせて削除する
　※ディレクトリの中のファイルやディレクトリもまとめて削除される
$ rm -r <ディレクトリ名>

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

# ファイルの削除前に確認
$ rm -i <ファイル名>
```
### mv
ファイルの移動、ファイル名を変更すうるコマンド

```
$ mv [オプション]<移動元> <移動先>

# ファイル名を変更
$ mv <旧ファイル名> <新ファイル名>

# 例
# ファイル名をfileからfile1に変更
$ mv file file1

# ファイルを移動
$ mv <ファイル名> <ディレクトリ名>

# 例
# fail1をdir/に移動
$ mv file1 dir/
```

### cp
ファイル・ディレクトリをコピーするコマンド

```
$ cp [オプション] <コピー元> <コピー先>

# ファイルをコピー
$ cp <ファイル名> <ファイル名>

# 例
# fileをnew_fileにコピー
$ cp file new_file

#ファイルをディレクトリ内にコピー
$ cp <ファイル名> <ディレクトリ名>

# 例
# fileをdir/にコピー
$ cp file dir/
```
**よく使うオプション**
```
# 上書き前に確認する
$ cp -i <ファイル名> <ファイル名>

# ディレクトリをコピーする
$ cp -r <ディレクトリ名> <ディレクトリ名>
```

### ln
リンクを張るコマンド

**リンクを張るとは？**
Linuxではファイルに別名を付けることができ、別名を付けることを「リンクを張る」という。
リンクには2種類あって「ハードリンク」と「シンボリックリンク」がある。
- ハードリンクとは
1つのファイルの実体に複数の名前を付ける機能で元のファイルを削除しても消えない。
全てのハードリンクがなくなったときに削除されるもの。

- シンボリックリンクとは
リンク先のパス名が書かれた特殊ファイルのことで、リンク先がファイルの実体。
シンボリックリンクを残したままファイルの実体を削除したり、ファイルを移動するとファイルを参照できなくなってしまう。

```
$ ln [オプション] <リンク元ファイル> <リンク名>

# ハードリンクを張る
$ ln <ファイル名> <ファイル名>
# 例
$ ln file1 file2
```
**よく使うオプション**
```
#　シンボリックリンクを張る
$ ln -s <リンク元ファイル> <リンク名>
# 例
$ ln -s file1 file3
```
:::note info
オプションを付けないとハードリンクの作成
オプションを付けるとシンボリックリンクの作成になる。
:::

### find
ファイルを検索するコマンド
```
$ find <検索開始ディレクトリ> <検索条件> <アクション>
# 例
# AREADME.mdという名前を持つファイルを探してそのパスを表示する
$ find . -name README.md -print
```

**よく使われる検索条件**
```
#フ ァイル名を指定してファイルを検索。ファイル名の大文字小文字は区別する。
$ find . -name README.md

# ワイルドカードが使える。*を使うときは''で囲う
$ find . -name '*.html' -print

# ファイル名を指定してファイルを検索。ファイル名の大文字小文字は区別しない。
$ find . -iname readme.md

# 通常ファイルの検索
$ find . -type f -print

# シンボリックリンクの検索
$ find . -type l -print

# ディレクトリの検索
$ find . -type d -print

# 複数の検索条件を指定。-aは省略可能。
$ find . -type d -a -name images -print
```

### chmod
ファイルやディレクトリのパーミッションを設定するコマンド
```
$ chmod [ugoa] [+-=] [rwx] <ファイル名>
# 例
$ chmod u+r file

# 数値で指定
$ chmod <8進数の数値> <ファイル名>
# 例
$ chmod 755 file
```
:::note info
通常の指定は相対指定、数値指定は絶対指定
:::

<table>
    <thead>
        <tr>
            <th>記号</th>
            <th>内容</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>u</td>
            <td>所有者の権限</td>
        </tr>
        <tr>
            <td>g</td>
            <td>グループの権限</td>
        </tr>
           <tr>
            <td>o</td>
            <td>その他ユーザーの権限</td>
        </tr>
         <tr>
            <td>a</td>
            <td>全てのユーザーの権限</td>
        </tr>
        <tr>
            <td>+</td>
            <td>権限の追加</td>
        </tr>
        <tr>
            <td>-</td>
            <td>権限を削除</td>
        </tr>
        <tr>
            <td>=</td>
            <td>記述した権限にする</td>
        </tr>
    </tbody>
</table>

<table>
    <thead>
        <tr>
            <th>パーミッション</th>
            <th>数値</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>r(読み取り)</td>
            <td>4</td>
        </tr>
        <tr>
            <td>w(書き込み)</td>
            <td>2</td>
        </tr>
           <tr>
            <td>x(実行)</td>
            <td>1</td>
        </tr>
    </tbody>
</table>


### chown
ファイルの所有者やグループを変更するコマンド

```
$ chown <ユーザーorはグループ> <ファイルorディレクトリ>

# 例
# test1.txtのユーザー所有権を変更する
$ chow root test1.txt

#　グループの所有権も変更する場合
$ chow root:root test1.txt
```


### ps
実行中のプロセスを表示するコマンド
```
$ ps [オプション]

# 例
$ ps
```

**よく使うオプション**
```
# 全ユーザーのプロセスを、詳細情報を合わせて表示
$ ps aux
```

### kill
ジョブやプロセスを終了させるコマンド

```
$ kill %<ジョブID>
$ kill %<プロセスID>

# 例
$ kill %1
$ kill 4965
```


## コマンドの使い方を調べるコマンド
```
$ <コマンド> --help

# 例
$ ls --help
```
:::note info
使用方法、コマンドの概要、利用可能なオプション一覧を教えてくれるので、コマンドの概要を知りたい時に使えるコマンド。

:::

## 最後に
LinuxについてとLinuxの基本コマンドの使い方について
書いてきました。
実際にコマンドを打って理解を深めていきたいですね。

今回はこのへんで！
ありがとうございました。


## 参考文献
[もう怖くないLinuxコマンド。手を動かしながらLinuxコマンドラインを5日間で身に付けよう | Udemy](https://www.udemy.com/course/unscared_linux/)
[Linux標準教科書](https://linuc.org/textbooks/linux/)