【初学者向け】Linux基本コマンドまとめ

# はじめに
この記事はlinux初学者向けに基本コマンドをまとめています。
私も初学者で勉強中です。
各見出しを利用場面にしているので、こんな時に使いたい、と思った見出しがあれば見てみてください。


# ディレクトリについて
コマンド紹介の前に、ディレクトリについて解説します。
ディレクトリとは、WindowsやMac OSで言うところの「フォルダ」です。

CUIで操作する場合、ディレクトリの移動もコマンドで操作を行います。
このコマンドは後ほど解説します。

# ディレクトリの移動コマンド

ディレクトリの移動を行いたい場合に利用します。

```linux:コマンド
cd ディレクトリ
```
オプションを指定することも可能ですが、
基本的にcdコマンドはオプションをつけずに使います。

例）フォルダ構成を以下の通りとします。

/ (ルートディレクトリ)
┣home
┃┗user
┃ ┗practice
┗other

カレントディレクト（＝現在の場所）がhomeであり、ここから/user/practice に移動したい場合、以下のように指定します。

```linux:相対パスでの指定方法
$ cd user/practice
```

:::note
相対パスとは？
カレントディレクトリからのパスを示したもの
:::

このほか、同じuser/practiceに移動したい場合は、下記のように示すこともできます。

```linux:絶対パスでの指定方法
$ cd /home/user/practice
```

:::note
絶対パスとは？
ルートディレクトリ（/）からのパスを示したもの
:::


# ルートディレクトリとは？
linuxの場合、ディレクトリは1つの大きなツリーとなります。
（WindowsやMacの場合、Cドライブ、Dドライブなどドライブごとで複数ツリーができる）

ツリーの開始となるディレクトリがルートディレクトリです。

# 特殊なディレクトリの指定方法

ディレクトリを指定する際、通常の指定方法ではなく特別な指定ができる場合があります。
以下の通りです。

|記号|指定ディレクトリ|
|:-:|:-:|
|/|ルートディレクトリ|
|~|ホームディレクトリ<br>（/home/ユーザー のディレクトリ）|
|.|カレントディレクトリ|
|..|親ディレクトリ<br>（カレントディレクトリのひとつ上のディレクトリ）|

# カレントディレクトリを表示する

カレントディレクトリを表示したい時に使用するコマンドです。
自分がどこにいるのかわからなくなった場合などに使用します。

```linux:コマンド
$ pwd 
```

基本的にpwdコマンドはオプションをつけずに使います。

# ファイル・ディレクトリの中身を見る

ファイル・ディレクトリの中身を確認したい時に使用するコマンドです。

```linux:コマンド
$ ls オプション ファイル名（もしくはディレクトリ名）
```

ファイル名（もしくはディレクトリ名）を指定しない場合は、カレントディレクトリの中身を表示することができます。

- オプションコマンド一覧

|コマンド|操作|
|:-:|:-:|
|a|隠しファイルも含めて表示する|
|l|ディレクトリやファイルの権限など詳細情報も含めて表示する|
|F|ファイルの種別を表示する※|
|t|更新時間の降順でソートして表示する|
|r|通常と逆順でソートして表示する|

※ディレクトリには末尾に/が付き、通常のファイルでは末尾に*が付くなどわかりやすくなっています。

# ディレクトリを作成する

ディレクトリを作成したい時に使用するコマンドです。

```linux:コマンド
$ mkdir オプション ディレクトリ名
```

:::note warn
ディレクトリ名の指定は必須です。
下記のようなコマンドはNGです。

```linux:コマンド
$ mkdir
```
:::

ファイルを作成したい際のコマンドは、[こちら](#ファイルのタイムスタンプを更新する・ファイルを作成する)。

# ディレクトリを削除する

ディレクトリを削除したい時に使用するコマンドです。

```linux:コマンド
$ rmdir オプション ディレクトリ名
```

:::note warn
ディレクトリの作成時同様に下記のようなコマンドはNGです。

```linux:コマンド
$ rmdir
```
:::

ディレクトリの中身が存在する場合、rmdirコマンドでディレクトリの削除はできません。
中身ごとまとめてディレクトリを削除したい際のコマンドは、[こちら](#ファイルを削除する)。

# ファイルの中身を確認する

テキストファイルなど、中身を確認したい際に使用するコマンドです。

```linux:コマンド
$ cat オプション ファイル名
```

- オプションコマンド一覧

|オプション|操作|
|:-:|:-:|
|n|中身を表示する際に先頭に行番号をつけて表示する|

# ファイルの中身をスクロールで確認する
テキストファイルで１画面での確認が大変だったりする場合、
スクロールで確認できるようにするコマンドです。

```linux:コマンド
$ less オプション ファイル名
```

- スクロール状態での移動コマンド

|コマンド|操作|
|:-:|:-:|
|j|一行下に移動|
|k|一行上に移動|
|b|一画面分上に移動|
|f, スペース|一画面分下にスクロール|
|q|lessコマンドを終了|

j,k,qはvimのコマンドと同じと考えると馴染みのある人は覚えやすいかもしれません。
vimに関しては[こちら](https://qiita.com/akari4_4/items/920fc3b277e13237e8de)

# ファイルの最後を確認する

ファイルの末尾の内容を確認したい時などに使用します。

```linux:コマンド
$ tail オプション ファイル名
```
- オプションコマンド一覧

|コマンド|操作|
|:-:|:-:|
|n|末尾からの行数を指定して出力|
|c|末尾からのバイト数を指定して出力|

# ファイルのタイムスタンプを更新する・ファイルを作成する

すでにファイルが存在している場合はファイルのタイムスタンプを更新し、
ファイルが存在しない場合は、空のファイルを新規作成します。

```linux:コマンド
$ touch ファイル名
```

例）test.txt といったファイルを新しく作りたい場合は、
```linux:コマンド
$ touch test.txt
```

で実行します。
ファイルのタイムスタンプ更新も同様のコマンドで行えます。

# ファイルを削除する

ファイルの削除を行いたい場合に使用するコマンドです。

```linux:コマンド
$ rm ファイル名
```

:::note warn
rmコマンドは使ったタイミングで即時削除されるため要注意
:::

rmコマンドはファイル削除用コマンドなので

```linux:コマンド
$ rm ディレクトリ名
```

このようなディレクトリ削除はできません。
ディレクトリを削除したい場合、
|コマンド|操作|
|:-:|:-:|
|r|削除するディレクトリの中身ごと削除する|

このオプションを付与すると削除できるため、
ディレクトリを削除する場合は[こちら](#ファイルの削除)のコマンドか、

```linux:コマンド
$ rm -r ディレクトリ名
```

で実行し、削除します。
ファイルの中身がある場合もまとめて削除されるため、要注意。

:::note
ファイル削除時に確認したい場合は、
```linux:コマンド
$ rm -i
```

で実行します。
:::

# ファイルを移動する、ファイル名の変更をする

- ファイルの移動は
```linux:コマンド
$ mv オプション ファイル名 移動先パス
```
で移動できます。

- ファイル名の変更は
```linux:コマンド
$ mv オプション 変更前のファイル名 変更後のファイル名
```
で変更できます。

- オプションコマンド一覧

|コマンド|操作|
|:-:|:-:|
|i|操作を行う前に確認する|
|f|確認を行わずに強制的に実行する|

# ファイルのコピーをする

```linux:コマンド
$ cp コピー元ファイル名
```

ファイル名をコピー元と別名でコピーしたい場合は、

```linux:コマンド
$ cp オプション コピー元ファイル名 コピー先のファイル名
```
で実行します。

::: note warn
ファイルが存在する場合、上書きされるため要注意。
:::

- オプションコマンド一覧

|コマンド|操作|
|:-:|:-:|
|i|操作を行う前に確認する|
|r|ディレクトリに対して操作する※|
|p|元ファイルの情報を引き継いで保存を行う（更新日時など）|

※rmコマンドをディレクトリに対して行う際のrオプションと同じです。オプションにrを付与せずディレクトリをコピーしようとするとエラーになります。

# リンクを作成する

- リンクとは？
リンクには　_ハードリンク_　と　_シンボリックリンク_　の2種類があります。<br><br>

- ハードリンク
ファイル名に対して使います。ディレクトリに対しては使えません。<br><br>

- シンボリックリンク
ディレクトリに対しても使えます。<br><br>

- リンクの使い方
よくアクセスするファイルやディレクトリのパス名が長い場合、毎回入力するのは大変なのでリンクを作成して作成したリンク名で簡単にアクセスできるようにします。<br><br>

```linux:ハードリンク作成コマンド
$ ln 元ファイル名　リンク名
```

```linux:シンボリックリンク作成コマンド
$ ln -s 元ファイル名　リンク名
```

シンボリックリンクは、ハードリンクの実行コマンドに-sオプションを付与します。


# ファイル、ディレクトリを検索する

```linux:コマンド
$ find 検索開始場所 検索条件 検索後のアクション
```
で検索できます。

例）ルートディレクトリから検索を開始して、text.txtのファイル名と一致するファイルが存在する場合、ファイルのパスを表示する。
としたいときは下記のコマンドで実行します。
```linux:コマンド
$ find / -name text.txt -print
```

# ファイルのパーミッション（権限）を変更する

```linux:コマンド
$ chmod 変更する権限 変更アクション パーミッション ファイル名（もしくはディレクトリ名）
```

例）ディレクトリ practiceに全ユーザーに対して読み取り権限のみを付与する場合
```linux:コマンド
chmod a=r practice
```

- 変更する権限について
所有者か、全ユーザーかなどの対象を指定します。下記4種類です。

|コマンド|対象|
|:-:|:-:|
|u|所有者のみ|
|g|グループのみ|
|o|その他ユーザーのみ|
|a|全てのユーザー|

- 変更アクションについて
権限を指定した状態に変更します。下記３種類です。

|コマンド|アクション|
|:-:|:-:|
|+|権限を追加|
|-|権限を削除|
|=|指定した権限のみにする|

- パーミッションについて
ファイルの所有者（オーナー）やその他のユーザーなどで権限を設定できます。権限は下記3種類です。

|コマンド|権限|
|:-:|:-:|
|r|読み取り（read）|
|w|書き込み（write）|
|x|実行（exe）|

上記コマンドはそれぞれを8進数で表現し、コマンドでの設定時にも8進数の値を利用することができます.

|権限|8進数表記|
|:-:|:-:|
|r|4|
|w|2|
|x|1|

# ファイルの所有者（オーナー）を変更する

ファイルには作成時のユーザーをファイル所有者として設定されて保存されます。
ファイル所有者を変更したい際は以下のコマンドを実行します。

```linux:コマンド
$ chown 変更後の所有ユーザー名 変更したいファイル名（もしくはディレクトリ名）
```

※ユーザー権限を変更する場合、root権限でないユーザーで実行すると権限なしで実行できません。
実行する権限に気をつけましょう。

# 実行中プロセス一覧表示する
現在実行されているプロセスを一覧表示します。

```linux:コマンド
$ ps オプション
```

オプション一覧
|コマンド|操作|
|:-:|:-:|
|a|実行ユーザー以外の全ユーザーのプロセス|
|u|詳細情報も表示する
|x|psコマンド実行ユーザーのプロセス|

:::note warn
psコマンドはオプション付与時にハイフンをつけないので要注意
:::

# プロセス・ジョブを終了する

- プロセスIDで指定する場合
```linux:コマンド
$ kill プロセスID
```

- ジョブ番号で指定する場合
```linux:コマンド
$ kill %ジョブ番号
```

例）プロセスIDが1047、ジョブ番号が2の場合
```linux:コマンド
$ kill 1047
```

もしくは、
```linux:コマンド
$ kill %2
```

で終了できます。

# まとめ

基本的なコマンドでも数が多く、オプションなどを含めると覚えるのは大変です。
少しずつ実際にコマンドを実行してみて覚えていきましょう。
私の場合、コマンド実行前にどのような結果になるかを想像してから実行すると、覚えが速くなります。