覚えておきたいLinux コマンド

私は普段WSL環境で開発を行っています。開発する中で、`mkdir`や`touch`、`cd`コマンド等は頻繁に使うので覚えているのですが、他のコマンドは使うたびに調べている状況です。

さすがに面倒になってきたので、自分がよく使うなと思ったコマンドや、使ったことないけど便利そうだなというコマンドをまとめました。

Linux初心者なので、間違いなどがあれば指摘していただけると幸いです。

# よく使うコマンド

## cd

`cd path/to/dir` でディレクトリを移動することができる。

ホームディレクトリに移動したいときは、`cd` か `cd ~` とすればよい。

## ls

カレントディレクトリ内のファイルやフォルダを一覧表示する。

### -a

このオプションを付けると、ドットファイル（例：.git）も表示する。

### -l

ファイルの詳細も表示するオプション。

左から、ファイルタイプ、パーミッション、ハードリンク数、オーナー名、グループ名、バイトサイズ、タイムスタンプ、ファイル名の順で表示される。

```shell
$ ls
dir file

$ ls -a
. .. dir file

$ ls -l
total 4
drwxr-xr-x 2 user user 4096 Feb 15 16:35 dir
-rw-r--r-- 1 user user    0 Feb 15 16:34 file
```

## mv

ファイルやディレクトリを移動させたり、名前を変更する時に使う。

以下のようにすることで、複数のファイルを移動先ディレクトリに移動させられる。

`mv ファイル1 ファイル2 ・・・ 移動先ディレクトリ`

また、以下のようにして、ファイル名を変更する。

`mv 古いファイル名 新しいファイル名`

具体的な仕様例を以下に示す。

```shell
$ ls                   # 現在の状態
file1 file2 file3 dir

$ mv file1 file4       # ファイル名の変更
$ ls
file4 file2 file3 dir

$ mv file4 dir/file1   # ファイル名の変更かつ移動
$ ls dir/*
dir/file1

$ mv file2 file3 dir   # 複数ファイルの移動
$ cd dir
$ ls
file1 file2 file3
```

### -i

移動先に同名のファイルがある場合は、上書きするかどうかの確認メッセージを表示する。

## clear

ターミナルの画面をクリアにする。

## mkdir

`mkdir dir-name` でディレクトリを作成する。

### -p

必要に応じて親ディレクトリも一緒に作成する。

```shell
$ ls                     # 現在の状態（何もない）
$ mkdir dir
$ ls
dir

$ mkdir -p p-dir/dir     # 親ディレクトリも作成
$ ls
dir p-dir
```

## touch

`touch file-name` でファイルを作成する。

## rmdir

`rmdir dir-name` で中身が空のディレクトリを削除する。

### -p

必要に応じて親ディレクトリも削除する。

```shell
$ ls                # 現在の状態
p-dir file
$ ls p-dir
dir

$ rmdir p-dir/dir   # 親ディレクトリも削除
$ ls
file
```

## rm

`rm file-name` でファイルを削除する。

### -r

ファイルだけでなく、ディレクトリも削除する。

## vi

`vi file-name` でLinux標準のエディタ（Vim）を起動する。

Vimは慣れるまでかなり時間がかかるが、慣れてしまうと他のエディタが使えなくなってしまう、らしい。ちなみに私はちょっとしたファイルの編集程度でしか使ったことがない。

いつか使いこなせるようになってみたい。

vimについて書きだすと今回の趣旨からずれてしまうため、割愛させていただく。

# たまに使うコマンド

## cat

`cat file-name` でファイルの中身を閲覧する。

`cat file1 > file2` でfile1の中身をfile2に書き込むことができる（上書き）。

`cat file1 >> file2` で追加書き込み。

具体的な仕様例を以下に示す。

```shell
$ ls                   # 現在の状態
file1 file2
$ cat file1            # file1の中身を確認
file1
$ cat file2            # file2の中身を確認

$ cat file1 > file2    # file2にfile1の中身を上書き
$ cat file2
file1

$ cat file1 >> file2   # file2にfile1の中身を追加書き込み
$ cat file2
file1
file1
```

### -n

行番号を付けて出力する。

### -b

空行以外に行番号を付ける。

## echo

与えられた文字、数値、変数などを表示する。

環境変数の中身を確認したいときによく使う。

```shell
$ echo $HOME
/home/user
```

また、ファイルへの書き込みもできる。使い方としては `cat` コマンドと変わらない。

```shell
$ echo "Hello" > file
$ cat file
Hello

$ echo "World" >> file
$ cat file
Hello
World
```

## ssh

`ssh 接続先` でリモートマシンにSSH接続する。

```shell
$ ssh example.com        # example.comに接続
$ ssh user@example.com   # ユーザ名（user）を指定
```

### -i

秘密鍵を使用するときに使うオプション。

```shell
$ ssh -i key-file.pem user@example.com
```

### -p

ポート番号を指定する。

## curl

APIを叩くときに使用するコマンド。

```shell
curl localhost:8080/api/users    # GETリクエスト
[
    {
        "id": 1,
        "name": "chellwo"
    }
]
```

### -X

メソッドを指定。

### -H

リクエストヘッダを使用してリクエストするときに使用。

### -d

リクエストボディを使用してリクエストするときに使用。

```shell
$ curl -X POST -H "Content-type:application/json" -d '{"name":"super-chellwo"}' localhost:8080/api/users
{
    "id": 1,
    "name": "chellwo"
}
$ curl -X GET -H localhost:8080/api/users
[
    {
        "id": 1,
        "name": "chellwo"
    },
    {
        "id": 2,
        "name": "super-chellwo"
    }
]
```

### -I

レスポンスヘッダを表示する時に使用。

```shell
$ curl -I localhost:8080/api/users
HTTP/1.1 200 OK
Content-Type: application/json
...
```

## help

`help コマンド名` でコマンドのマニュアルを表示する。

# 使ったことがあるコマンド

## cp

`cp コピー元 コピー先` でファイルをコピーする。コピー先ファイルが存在しなければ、新規作成する。

`cp コピー元1 コピー元2 コピー先ディレクトリ` で複数ファイルをコピーする。ディレクトリは新規作成されない。

```shell
$ ls                      # 現在の状態
file dir
$ cat file
Hello

$ cp file cp-file         # ファイルをコピー
$ cat cp-file
Hello

$ cp file cp-file dir     # 複数ファイルをディレクトリにコピー
$ ls dir
file cp-file
```

### -r

ディレクトリごとコピーする。

### -i

上書きされるファイルがある場合、確認メッセージを表示する。

## grep

`grep 検索文字列 ファイル名` でファイル内の文字を検索する。

```shell
$ ls                 # 現在の状態
file1 file2
$ cat file1 file2
Hello                # file1の中身
World                # file2の中身

$ grep He *          # 文字列Heを検索
file1:Hello
```

### -i

大文字と小文字を区別せずに検索する。

### -n

検索結果に行番号を表示する。

### -l

検索結果にファイル名のみを表示する。

### -r

ディレクトリ内も検索する。

## free

`free` でメモリ状況を確認する。

### -h

人間が読みやすい単位に変換してくれる。

```shell
$ free -h
       total  used   free   shared  buff/cache  available
Mem:   3.8Gi  783Mi  2.0Gi   227Mi       1.1Gi      2.6Gi
Swap:  1.0Gi  147Mi  876Mi
```

# 使ったことないけど、便利そうなコマンド

## pwd

カレントディレクトリを表示する。例えば、ホームディレクトリで実行すると、以下のようになる。

```shell
$ pwd
/home/user
```

## find

`find ファイル名` でファイルが存在するかを検索する。

### -name

`fine 検索先 -name ファイル名` とすることで、ファイル名やディレクトリ名があやふやな時にも検索できる。

```shell
$ ls dir                    # 検索したいファイルの場所
file1

$ find /home/ -name file1   # 検索
/home/user/dir/file1
```

## less

`less ファイル名` でファイルの中身を1画面ずつ表示する。

`q` キーを押すと閲覧を終了する。

## history

`history` で過去に使用したコマンドを表示する。

### -c

端末に記録されているコマンド履歴を消去する。

### -w

`history -w ファイル名` でコマンド履歴をファイルに書き込む。

### -r

`history -r ファイル名` でファイルに書き込まれているコマンド履歴を端末に書き込む。

# 最後に

今回は特に重要そうだと感じたLinuxコマンドをまとめてみました。

他にもコマンドやオプションはいろいろありますが、ここに書いたコマンドを使いこなせるようになるだけでもかなり楽になると思います。

Linuxコマンドで爆速開発できるように頑張ります。