【Linux】Linuxコマンドまとめ

# 概要
Linuxを勉強していてこれだけは覚えたほうがいい基本的なコマンドについてまとめてみました。
Linuxの基本的な知識については過去の記事にあるので是非そちらも参照してみてください。
## ショートカットキーについて　『Mac』
Linuxは、MacOSやWindowsOSと違ってキーボードだけで操作する`CLI環境`になります。
コマンドは、キーボードから文字列として入力し実行することになるので、まずはキーボード操作が楽になるショートカットキーについてまとめていきます。


```bash:bash
＄　echo Hello
```
`$`はプロンプトといいます。シェルがコマンドの入力を待っているという意味です。
プロンプトの後ろの方に入力してある＜echo Hello＞の部分を`コマンドライン`といいます。コマンドを入力する場所です。

ではよく使うショートカットキーを下記表にまとめていきます。


|ショートカットキー |説明  |
|---|---|
左右矢印キー | カーソル移動、一文字ずつ移動することができる　|
|Ctrl + a| 行頭に直接移動 |
|Ctrl + e|行末に直接移動|
|Esc押してからb|単語単位で一つ前に移動|
|Esc押してからf|単語単位で一つ後ろに移動 |
|Ctrl + w| 一単語丸ごと削除 |
|Ctrl + k|カーソル位置から行末までを削除　カット|
|Ctrl + u|カーソル位置から行頭までを削除　カット|
|Ctrl + y|最後に削除した内容を挿入する　　ヤンク|
## トラブル時には
キー操作をしてコマンドを入力していると、何らかの拍子にキーボードからの操作を受け付けないとか、プロンプトが返ってこなくなる時があります。、、、、僕もありました。

ほとんどが単純なキー操作ミスによるものです。`Ctrl + s`を押してしまうと上記のような事が発生してしまいます。これは画面をロックする時に使います。`ctrl + q`を押せばこのロックは解除できます。
|ショートカットキー |説明  |
|---|---|
Ctrl + s|画面をロック|
|Ctrl + q|画面ロック解除|

## コマンドが終了せずに、プロンプトが返ってこない
Linuxの一部のコマンドには実行した後、終了操作をしない限り、動き続けるコマンドがあります。
このようなコマンドはプロンプトが返ってこないので自分で終了させないといけません。
`実行中のコマンドを強制終了させるには、Ctrl + c`を入力します。


```bash:bash
＄　ping 192.168.2.67
64 bytes from 192.168.2.67: icmp_sep=1 ttl=64 time=0.016 ms
64 bytes from 192.168.2.67: icmp_sep=1 ttl=64 time=0.016 ms
^C 　⇦ここでCtrl + cを入力した
```
上記の例では、pingというコマンドを実行しています。このコマンドは一秒に一回の確認を永遠に続けるため、`Ctrl + c`を押して強制終了させました。

このようにシェル上では`Ctrl + c`の入力を`^記号で表現`してくれます。
　
また、コマンドラインの途中まで入力したとこで入力内容の誤りに気がついたときは、`ctrl + c`を入力する事で、入力内容を破棄して新しいコマンドラインに移る事ができます。
　
```bash:bash
＄　echo Hello　⇦最初から入力し直すために、Ctrl + cを入力
＄　　　　　　　　⇦入力内容が破棄され、新しいコマンドラインになった
```

## 補完機能
CLI環境でコマンドを実行するには、コマンドをキーボートから入力しなければなりません。
しかし、長いコマンドを毎回入力するのは大変なので`bashというシェルには`コマンド入力の手間を省く`補完機能`というものが備わっています。

`bashの補完機能は、Tabキーを押す事で使用`できます。
```bash:bash
＄　ec　　⇦ここでTabキーを押すと
＄　echo　　⇦echoと自動表示される
```
ちなみに複数候補がある場合は、警告音が鳴るのみでシェル上には何も変化が起こりません。
ここでさらにもう一度Tabキーを押すとコマンドの一覧リストが表示されます。


## コマンド履歴
Linuxを使っていると、以前実行したことのあるコマンドラインを再び実行したいときがあります。
また、以前のコマンドラインを少し修正したいといった場面も出てきます。

bashというシェルは一度入力したコマンドラインの内容を自動的に履歴として記録しています。

|コマンド|内容  |
|---|---|
Ctrl + p,または上矢印キー| 一つ前のコマンドラインを表示　|
|Ctrl + n,または下矢印キー| 次のコマンドラインを表示 |

## ディレクトリの移動
ディレクトリ移動と確認のコマンドについて
|コマンド|機能  |
|---|---|
pwd|カレントディレクトリを表示する|
|cd|カレントディレクトリを変更する|
|ls|ディレクトリの内容を表示する|

・`pwd`を入力する事で自分が今どこのディレクトリ（カレントディレクトリ）で作業しているのかが表示されます。

```
＄　pwd
 /home/abcd　　⇦現在の自分の位置
```

・`cd`を入力する事でカレントディレクトリを変更する事ができます。ディレクトリを移動するという事です。
```
＄　cd /usr 　⇦/usrディレクトリに移動
```
上記のようにコマンドの後ろにスペースを開けて指定する文字列（上記の例なら/usr)のことを`コマンドライン引数`といいます。

正しく移動できたかどうかは先ほどの`pwd`で確認します。正しく移動できていれば下記のように表示されます。
```
＄　pwd
 /usr   ⇦usrディレクトリに移動できた
```
引数をつけずにcdコマンドを実行すると、`ホームディレクトリ（ログイン時のディレクトリ）`へ移動します。
```
$ cd
$ pwd
 /home/abcd
```
## 絶対パスと相対パス

カレントディレクトリの直下のサブディレクトリには`/`をつけなくても移動できますが、もし、カレントディレクトリからみて離れているディレクトリに移動する時は`絶対パス`または`相対パス`で指定してあげないといけません。
　
・`絶対パスはルートディレクトリを起点としてファイルやディレクトリのパスを示す事です。`
　ディレクトリが深い位置にある時は、長い文字列となり不便です。

・`相対パスはカレントディレクトリを起点として表されるパスのことです。`

少しややこしいですが、下記表で説明していきます。
例・・・/の下にhome→abcd→work というディレクトリ構造があったとします。
　　　　そしてworkディレクトリの中にはfile1というファイル、abcdディレクトリの中にはfile2というファイルがあるとします。
　　　　カレントディレクトリ（現在の位置）はabcdだとします。
|相対パス|絶対パス|
|---|---|                                                                           
|../..|/|
|..|/home|
|.|/home/abcd|
|workまたは./work|/home/abcd/work|
|work/file1または./work/file1|/home/abcd/work/file1|
|file2または./file2|/home/abcd/file2|

`[.]`はカレントディレクトリを示しています。
`[..]`はひとつ上のディレクトリを示しています。../../../../とすれば4つ上のディレクトリを指す事ができます。

Linuxにおいて相対パスと絶対パスの理解はかなり重要です。

## lsコマンド
`lsコマンドは、ファイルやディレクトリを一覧表示するためのコマンド`です。
引数を指定しない場合、カレントディレクトリのファイルとディレクトリを表示します。また、引数にディレクトリを指定すると、そのディレクトリに含まれるファイルやディレクトリを表示します。
```
$ ls /   ⇦ルートディレクトリ（最上層）の内容を指定
 bin dev home lib64 mnt proc run srv tmp var
 boot etc lib media opt root sbin sys usr
```
lsコマンドはディレクトリの中身を示すもので、ファイルを引数に指定した場合、そのパスを表示してくれます。
```
$ ls /bin/cp  ⇦ファイルを引数に指定
 /bin/cp　　　⇦パスを表示
```
引数は複数指定することも可能です。この場合スペースで区切って指定しましょう。そうすると指定された引数全てに対して処理を行なって表示してくれます。
下記例では/と/usr、二つのディレクトリの内容が表示されています。
```
$ ls / /usr  ⇦スペースで区切って複数指定
 /:
 bin dev.........
 /usr:
 bin games lib........
```
## *(アスタリスク）と？（クエスチョン）について
lsコマンドの続きになりますが、いちいち全てのファイルを引数に並べるのは大変です。
そこでbashシェルには複数のファイルを指定する`パス名展開`という機能があります。
`*は任意の文字列`を表し、`?は任意の一文字`を表します。

例えばbaで始まるファイルを一覧表示したい時は、下記のように`ba*`と指定します。
```
$ ls ba*
 base64 basename bash bashbug bashbug-64  ⇦baから始まるファイルが表示された
```
例えば？を利用して4文字のファイルを表示したい時は、下記のように`ba??`と指定します。
```
$ ls ba??
 bash  ⇦4文字のファイルが表示された
```
なおここで紹介した`パス名展開`は、lsコマンド特有のものではなくて、シェルの機能なので他の全てのコマンドでも利用する事ができます。

## lsコマンドのオプション
ほとんどのコマンドは、コマンドライン引数に、ーではじまる追加の引数を指定する事ができます。これを`オプション`といいます。
Linuxのコマンドは、オプションを指定する事でデフォルトとは違う動きをするようになります。
　
例えば`-F`をつける事でファイルの種類を表示してくれます。
```
$ ls -F
 bin@ dev/ home/ lib64/ mnt/ proc/ sbin@  ⇦後ろに記号がついて種類を表示している
```
・-Fオプションで表示されるファイル種別
|種類|記号|
|---|---|
|通常ファイル|なし|
|ディレクトリ|/|
|実行可能ファイル|*|
|シンボリックリンク|@|

## mkdirコマンド　ーディレクトリを作成ー
新しくディレクトリを作成するには、`mkdir`コマンドを使います。
```
$ mkdir  work  ⇦workというディレクトリを作成

$ ls -F　⇦作成できているか確認
 work/　⇦作成できている
```
なお、既に同名のディレクトリが存在する場合、作成は失敗します。

### ー深いディレクトリを作成するー
何階層もある深いディレクトリを作成するには、例えば`$ mkdir report/2022/10`と指定します。
しかし、指定したパスの途中のディレクトリが存在しない場合、`mkdirコマンド`はエラーとなってしまいます。

一気にディレクトリを作成したい時は、存在しないディレクトリも含めて作成する事ができる`-p`オプションを使います。
```
$ mkdir -p report/2022/10  ⇦こうすれば、report,2022というディレクトリを事前に作成しなくても10を作成できる
```
## touchコマンド　ーファイルを作成ー
`touchコマンド`は、引数で指定した名前のファイルを作成することができます。
複数のファイルを作成したい時はスペースで区切って入力してください。
```
$ touch file1　⇦ファイル作成

$ ls -F  ⇦ファイルが作成できているか確認
file1
```
touchコマンドは、既存の名前のファイルを作成しても、`内容が上書きされたり削除されたりしない`ため安全です。

## rmとrmdirコマンド　　ーファイル・ディレクトリの削除ー
ファイルの削除には`rmコマンド`を使います。
```
$ ls   
file1　　⇦ファイルが存在する

$ rm file1　　⇦ファイル削除

$ ls　　
$　　　　⇦ファイルが削除されている
```
スペースで区切る事で、複数のファイルを削除することもできます。
しかし、rmコマンドでディレクトリを削除しようとするとエラーが出ます。

そこで`-rオプション`をつける事でディレクトリも削除する事ができるようになります。この際ディレクトリ内にあるファイルやディレクトリも一緒に削除されてしまうので注意が必要です。
```
＄　rm -r work  ⇦workというディレクトリを削除、work内のファイル、ディレクトリも削除される
```
MacOSなどは、削除しても一旦ゴミ箱に入るため元に戻すことができるのですが、Linuxではrmコマンドを実行すると本当に削除されてしまうので実行前には細心の注意が必要です。
そこで、`-iオプション`をつける事で、本当に削除してもよいか確認を求めるようになります。
基本的にはrmを実行する時は-iオプションをつけたほうがいいと思います。

### ー空のディレクトリを削除ー
`rmdirコマンド`は空のディレクトリを削除することができます。
rmとの違いは、`中にファイルがあるディレクトリを削除しようとするとエラーが出る`点です。
```
$ rmdir work  ⇦ディレクトリ削除、ここでworkディレクトリが空ではない場合エラーが出る
```
ちなみにLinuxでは、[.]が先頭についているファイルは隠しファイルとして認識されます。
rmdirを使う事で、隠しファイルに気づかず削除してしまうといったことを防ぐ事ができます。

## catコマンド　ーファイルの内容表示ー
ファイルの内容を確認するには、`catコマンド`を利用します。
下記の例は、touchで作成したfile1というファイルの内容を、catで表示したものです。
```
$ touch file1  ⇦ファイル作成

$ cat file1　　⇦ファイルの内容確認

$　　　　　　　　⇦中身がないので何も表示されない
```
catコマンドに限った事ではないですが、ファイルを指定しないで実行してしまうと、プロンプトが返ってきません。
そうなってしまったときは、`Ctrl + d`を押す事で解決します。

## cpコマンド　ーファイル・ディレクトリをコピーするー
ファイルをコピーするには、`cpコマンド`を使います。
```
$ cp <コピー元> <コピー先>  
```

下記例では、file1をfile2という名前でコピーしています。
```
$ cp file1 file2  ⇦file1をfile2という名前でコピー

$ ls -F　　
file1 file2　　⇦file2が作成された
```
次は、`コピー先にディレクトリを指定した場合`です。コピー先にディレクトリを指定した場合、コピー元のファイルはそのディレクトリ内に同一ファイル名でコピーされます。
```
$ cp file1 work  ⇦file1をworkディレクトリにコピー

$ ls work
file1　　⇦コピーされた
```

なお、ディレクトリ内にファイルをコピーする時は、`複数のファイルをまとめてコピー`する事ができます。
下記例では、workディレクトリ内にfile1,file2,file3というファイルをコピーしています。
```
$ cp file1 file2 file3 work 　⇦3つのファイルをworkディレクトリにコピー、引数の最後に指定したディレクトリにコピーされる

$ ls work
file1 file2 file3　　⇦コピーされた
```
cpコマンドは、コピー先のファイルが既に存在していたとしても、`確認などせずそのまま上書きしてしまいます。`
なお、`-iオプション`をつける事でコピー先ファイルが存在する場合本当に上書きしてもよいか確認されるようになるので、基本は`-i`をつけるようにしましょう。

cpコマンドでディレクトリをコピーしようとすると、エラーが出てしまいます。
そのため、ディレクトリをコピーする時は`-rオプション`を指定する必要があります。
```
$ cp work1 work2  ⇦これだとエラーが出る

$ cp -r work1 work2　　⇦-rをつける事でディレクトリをコピーできる
```
この際、上記のwork2ディレクトリが既に存在している場合、work1はwork2の中に名前を変えずにコピーされます。

## mvコマンド　ーファイルの移動・名前の変更ー
ファイルの移動には、`mvコマンド`を利用します。
`mvコマンド`は、移動先がファイルなのかディレクトリなのかで意味が変わ

### 移動元・移動先の両方がファイルの場合
```
$ mv file1 file2  ⇦移動元・移動先の両方がファイル

$ ls 
file2　　⇦file1がfile2という名前に変更された
```

上記のように両方がファイルの場合、file1がfile2という名前に変更されました。この場合、元のfile1は存在しなくなります。

### 移動先がディレクトリの場合
```
$ mv file1 work  ⇦file1をworkディレクトリに移動

$ ls work　　
file1　　⇦移動した
```
このとき移動先のファイルが既に存在している場合、確認なしに上書きされてしまいます。なのでcpコマンド同様、`-iオプション`をつけることをお勧めします。

### ディレクトリを移動させる場合
この場合は、移動元にディレクトリを指定するだけでそのディレクトリの下にあるファイルもまとめて移動する事ができます。

## lnコマンド　ーリンクを張るー
`lnコマンドは、リンクを張る`コマンドです。

### リンクとは
`ファイルには別名をつける`事ができます。この機能を`リンク`と呼び、別名をつけることを`リンクを張る`といいます。
リンクにはハードリンクとシンボリックリンクの2種類があります。

・ハードリンクを作成
```
$ ln file1 file2  ⇦ハードリンクfile2を作成

$ ls
file1 file2　　⇦file2が作成できた
```
このようにすることで、別のコマンドからfile2を指定すると、元のfile1にアクセスする事ができます。
では、今作ったハードリンクにアクセスしてみます。
```
$ cat file2
.......file1の内容が表示される
```
このようにハードリンクというのは、`1つのファイルに複数の名前をつける機能`です。

ハードリンクを持つファイルの実体は、`全てのハードリンクが削除`されたときになくなります。


・シンボリックリンクの作成
lnコマンドに`-sオプション`をつける事で作成する事ができます。
```
$ ln -s file1 file2  ⇦シンボリックリンク作成

$ ls -l
file1
file2→file1　　⇦このようにどのファイルを示しているかがわかる
```
このようにシンボリックリンクとは、`リンク先のパス名が書かれた小さな特殊ファイル`です。

## エイリアス
lsなどのコマンドは、ファイル種別を表示する-Fオプションなどがよく使われます。しかし、毎回毎回-Fオプションをつけるのはなかなか面倒だと思います。そこで、`alias`コマンドを利用することで`ls`と入力するだけで`ls -F`が実行されます。
```
$ alias ls='ls -F'  ⇦エイリアスの設定

$ ls /
bin@ dev/ home/ lib64@ mnt/ proc/ run/ srv/ tmp/ var/　　⇦lsと実行するだけでファイル種別表示
```
上記のように、エイリアスというのはわかりやすい別名を与えて、コマンドを使いやすくする機能のことです。

lsコマンドでは、このほかにも次のようなエイリアスが使われます。
`alias la='ls -a'`  ⇦全てのファイルを表示するという、laコマンド作成
 
`alias ll='ls -l'`　⇦ファイルの詳細情報を表示するという、llコマンドを作成


### エイリアスの確認
コマンドがエイリアスなのかどうか確認するには、`typeコマンド`を使用します。
```
$ type ls
lsは'ls -F'のエイリアスです　　⇦lsがls -Fのエイリアスになっている事がわかる

＄ type cp
cpは/bin/cpです　　⇦エイリアスではないので、実行ファイルが表示される
```
### エイリアスの削除
エイリアスを削除するには、`unaliasコマンド`を使います。引数に削除したいエイリアス名を指定する事で削除する事ができます。
```
$ unalias ls
```

### エイリアスを一時的に無効にする
一時的に何もオプションを付けずに元のコマンドのまま実行したい時があります。一時的に無効にする方法はいくつかあります。
まずは、`コマンドをフルパスで指定する`方法です。
```
$ /bin/ls 
```
次はコマンドの前に`command`を追加する方法です。commandの後ろに指定したコマンドはエイリアスとはみなされません。
```
$ command ls
```
次はコマンドの前に`\`(Macの場合option + ¥キー）を追加する方法です。1文字追加するだけでいいのでこれがおすすめです。
```
$ \ls
```