Linuxの基礎コマンドを簡単にまとめてみた

# はじめに
今回の記事では、初心者の方に向けてLinuxの基礎的なコマンドについて簡単に説明してみました。

 # Linuxとは？
 LinuxとはOSの一種です。OSとはコンピューターの全てのハードウェアを管理しているソフトウェアのことです。無料であることやカスタマイズ性の高さ、パソコンのスペックに左右されないなど様々な利点があるため、多くの人達に利用されています。

# Linuxの基本操作コマンド一覧

## cdコマンド
**cdコマンド**は現在のディレクトリから異なるディレクトリに移動するためのコマンドです。

```
yuutai@tanakayuudainoMacBook-Pro ~ % cd ~/Desktop/TEST
yuutai@tanakayuudainoMacBook-Pro TEST % 
```

〜（チルダ）の部分がcdコマンドによってTESTに変更されているのがわかると思います。これはルートディレクトリからTESTディレクトリに移動しましたということを意味しています。

### 特殊な指定方法について
| ディレクトリ | 意味| 指定方法 |
|:-:|:-:|:-:|
|   カレントディレクトリ|  現在自分がいるディレクトリ | . |
|  親ディレクトリ |  一つ上の階層のディレクトリ | .. |
|  ホームディレクトリ | ログイン時に属しているディレクトリ | ~ |
|   ルートディレクトリ| 一番上の階層のディレクトリ| / |

※
１、ホームディレクトリ
→各ユーザーがログインした際に、最初に移動するディレクトリのことをホームディレクトリといいます。
2、ルートディレクトリ
→一番上の階層のディレクトリのことをルートディレクトリといいます。
3、カレントディレクトリ
→今自分がいるディレクトリのことをいいます。

## pwd
**pwdコマンド**はカレントディレクトリを表示するためのコマンドです。

```
yuutai@tanakayuudainoMacBook-Pro ~ % pwd
/Users/yuutai
```

ログイン時には/Users/yuutaiというホームディレクトリにいることがわかります。

## ls
**lsコマンド**はカレントディレクトリの中に入っているファイル及びディレクトリを表示するコマンドです。

```
yuutai@tanakayuudainoMacBook-Pro TEST % ls
index.html	style.css
```

TESTディレクトリの中にはindex.htmlとstyle.cssの2つのディレクトリが入っていることが分かると思います。このようにlsコマンドを実行することによって、カレントディレクトリの中身を確認することができます。

## mkdir
**mkdirコマンド**とはディレクトリを作成するためのコマンドです。

```
yuutai@tanakayuudainoMacBook-Pro TEST % mkdir ddd
```
ディレクトリ名は英語でつけることをお勧めします。日本語の場合だと文字化けする可能性があるからです。

※一度に深いディレクトリを作りたい場合は以下のように記述し、コマンドを実行する。
```
yuutai@tanakayuudainoMacBook-Pro TEST % mkdir -p test/2019/rrr
```

上記の例のように、-pオプションをつけると、test 2019というディレクトリを事前に作る必要がなく、効率よく深いディレクトリを作ることができる。

## rmdir

**rmdirコマンド**とは空のディレクトリを削除するコマンドのことを言います。空ではないディレクトリーを削除しようした場合、エラーになります。そのため、中にファイルが入っているにもかかわらず、誤って削除してしまうといった事故を未然に防ぐことができます。

```
yuutai@tanakayuudainoMacBook-Pro work % mkdir newdir
yuutai@tanakayuudainoMacBook-Pro work % ls
newdir
yuutai@tanakayuudainoMacBook-Pro work % rmdir newdir
yuutai@tanakayuudainoMacBook-Pro work % ls
yuutai@tanakayuudainoMacBook-Pro work % 
``` 

## cat
**catコマンド**とはファイルの中身を表示するコマンドです。

```
yuutai@tanakayuudainoMacBook-Pro ~ % cat /etc/hosts
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1	localhost
255.255.255.255	broadcasthost
::1             localhost

```

上記のようにcatコマンドを使うと、hostsファイルの中身を表示することができる。

### -nオプション

-nオプションをつけることによって、行番号を指定することができます。

```
yuutai@tanakayuudainoMacBook-Pro ~ % cat -n /etc/hosts
     1	##
     2	# Host Database
     3	#
     4	# localhost is used to configure the loopback interface
     5	# when the system is booting.  Do not change this entry.
     6	##
     7	127.0.0.1	localhost
     8	255.255.255.255	broadcasthost
     9	::1             localhost
```

## less
**lessコマンド**とはファイルの中身をスクロール表示するコマンドです。オプションもありますが、使うことは滅多にありません。長いファイルを見たい時によく利用します。


```
yuutai@tanakayuudainoMacBook-Pro ~ % less /etc/group
```

## touch
**touchコマンド**とはファイル作成をするためのコマンドです。空のファイルを作る際によく利用します。間違ったファイルを指定したとしても、上書きしない点が大きなメリットです。

```
yuutai@tanakayuudainoMacBook-Pro work % touch Readme.md 
yuutai@tanakayuudainoMacBook-Pro work % ls
Readme.md
```

##rm
**rmコマンド**はファイル、ディレクトリを削除するコマンドです。rmコマンドを実行すると、ゴミ箱に行くのではなく本当に削除されてしまうので気をつけて使う必要があります。

```
yuutai@tanakayuudainoMacBook-Pro work % rm Readme.md
yuutai@tanakayuudainoMacBook-Pro work % ls
yuutai@tanakayuudainoMacBook-Pro work % 
```

### よく使うオプションについて

### -r

**-r**はディレクトリを削除できるオプションです。ディレクトリの中のファイルやディレクトリもまとめて削除されるので、使用する際は気をつける必要があります。

```
yuutai@tanakayuudainoMacBook-Pro work % mkdir dir1
yuutai@tanakayuudainoMacBook-Pro work % ls
dir1
yuutai@tanakayuudainoMacBook-Pro work % rm dir1
rm: dir1: is a directory
yuutai@tanakayuudainoMacBook-Pro work % rm -r dir1
yuutai@tanakayuudainoMacBook-Pro work % ls
yuutai@tanakayuudainoMacBook-Pro work % 
```

### -f

**-f**はファイルを削除する際の警告文を表示しないオプションです。

### -i

**-i**はファイルの削除前に確認してくれるオプションです。



## mv
**mv**はファイルの移動、ファイル名を変更するコマンドです。

 ・mv 既存のファイル名　新規のファイル名 の場合
→既存のファイルの名前が新しいファイル名に変更されます。

```
yuutai@tanakayuudainoMacBook-Pro work % ls
Readme.ma	source
yuutai@tanakayuudainoMacBook-Pro work % mv Readme.ma Readme.md
yuutai@tanakayuudainoMacBook-Pro work % ls
Readme.md	source
```
例で見てもわかるように、Readme.maがRead.mdにファイルの名前が変更されています。

・mv 既存のファイル名　ディレクトリ の場合

```
yuutai@tanakayuudainoMacBook-Pro work % ls
Readme.md	source
yuutai@tanakayuudainoMacBook-Pro work % mv Readme.md source
yuutai@tanakayuudainoMacBook-Pro work % ls
source
yuutai@tanakayuudainoMacBook-Pro work % ls source
Readme.md
```
mv Readme.md sourceというコマンドによって、Readme.mdというファイルをsourceというディレクトリの中に移動させています。ls sourceコマンドで見ても、Reade.meファイルがsourceディレクトリの中に入っているが確認できると思います。

## cp

**cpコマンド**とはファイル、ディレクトリをコピーするコマンドです。

・cp file new_file で実行した場合

```
yuutai@tanakayuudainoMacBook-Pro work % ls
dir	file	source
yuutai@tanakayuudainoMacBook-Pro work % cp file new_file
yuutai@tanakayuudainoMacBook-Pro work % ls
dir		file		new_file	source
```

上記のコマンドを使ったことによって、workディレクトリの中に元々入っていたfileをnew_fileと名付けた新しいファイルを複製することができています。

・cp file dir で実行した場合

```
yuutai@tanakayuudainoMacBook-Pro work % ls
dir		file		new_file	source
yuutai@tanakayuudainoMacBook-Pro work % cp file dir
yuutai@tanakayuudainoMacBook-Pro work % cd dir
yuutai@tanakayuudainoMacBook-Pro dir % ls
file
```

上記のコマンドを使ったことによって、workディレクトリの中に入っていたfileをdirディレクトリの中にコピーすることができています。

### オプション

・ -r オプション
**-rオプション**とはディレクトリをコピーするコマンドです。通常のcpコマンドで実行したとしてもエラーが起きます。そこで通常のcpコマンドに-rオプションをつけることによって、既存のdirというディレクトリをコピーし、newdirという名のdirと同じ中身の新しいディレクトリを複製することができるようになります。

```
yuutai@tanakayuudainoMacBook-Pro work % cp dir newdir
cp: dir is a directory (not copied).
yuutai@tanakayuudainoMacBook-Pro work % cp -r dir newdir
yuutai@tanakayuudainoMacBook-Pro work % ls
dir		file		new_file	newdir		source
yuutai@tanakayuudainoMacBook-Pro work % ls newdir
file
```

・ -i オプション
　上書きする前に確認をするオプションです。

```
yuutai@tanakayuudainoMacBook-Pro work % cp -i file new_file
overwrite new_file? (y/n [n]) y
```

## ln
lnコマンドの説明をする前にリンクを貼るとはどういうことかについてまず説明します。

#### リンクを貼るとは？
Linuxではファイルに別名をつけることをリンクを貼ると言います。リンクにはハードリンクとシンボリックリンクの2つがあります。

 .ハードリンク
 →1つのファイルの実体に複数の名前をつける機能のことを指します。リンク元のファイルが削除されたとしてもファイルの実体にアクセスすることができます。

 ・シンボリックリンク
 →リンク先のパス名が書かれた特殊なファイルで、リンクの先にファイルがあります。リンク元のファイルが削除されるとファイルの実体にアクセスすることができません。またシンボリックリンクファイルはリンク先のパス名のみが記載されているだけなので、それを消したとしても元のファイルには全く影響がありません。

 ![ハードリンク・ハードリンク](https://www.infraexpert.com/infragif/linux32a.gif)

 引用:https://www.infraexpert.com/infra/linux32.html

 ### lnコマンド
**lnコマンド**とはリンクを貼るコマンドです。

 .オプションを何もつけない場合はハードリンク

```
yuutai@tanakayuudainoMacBook-Pro work % ln file file_hard 
```

lnコマンドでfileというファイルに対してfile_hardというハードリンクをつけています。

### オプション
・　-s 
→シンボリックリンクを貼るオプションです。

```
yuutai@tanakayuudainoMacBook-Pro work % ln -s file file_s
```
### lnコマンド使用例

```
yuutai@tanakayuudainoMacBook-Pro work % ls
file		file_hard	file_s
yuutai@tanakayuudainoMacBook-Pro work % cat file_hard
hello
yuutai@tanakayuudainoMacBook-Pro work % cat file_s
hello
yuutai@tanakayuudainoMacBook-Pro work % rm file
yuutai@tanakayuudainoMacBook-Pro work % cat file_hard
hello
yuutai@tanakayuudainoMacBook-Pro work % cat file_s
cat: file_s: No such file or directory
yuutai@tanakayuudainoMacBook-Pro work % 
```

 ここではfileに対してfile_hardというハードリンクとfile_sというシンボリックリンクをつけています。具体例のコードの中には記載されていませんが、fileの中にはhelloという文字列が入っています。ハードリンクとシンボリックリンクのどちらのファイルにもhelloという文字列が入っています。
 次にfileという元のファイルを削除しているのですが、ハードリンクとシンボリックリンクのそれぞれ挙動が違います。ハードリンクであるfile_hardはfileとは別の名前が付けられた本物のファイルなので、中身を見ることができます。一方で、シンボリックリンクファイルであるfile_sは元のファイルが削除されたため、ファイルの中身を参照することができなくなっています。ハードリンクとシンボリックリンクには上記のような違いが見て取れます。


 ## find

 **fileコマンド**とはファイルを検索するコマンドです。書式はfind<検索開始ディレクトリ><検索条件><アクション>です。

```
yuutai@tanakayuudainoMacBook-Pro work % find . -name file1 -print
./file1
```

検索開始ディレクトリが.なので、カレントディレクトリの中からファイルを探そうとしていることが分かります。次に、検索条件を見てみると -name file1となっています。この検索条件はfile1という名前を持つファイルを探しますということを意味しています。もし見つかったら、-printというアクションによって./file1というパスが表示されるようになります。

### よく利用される検索条件

● -name
→ファイル名を指定してファイルを検索します。ファイル名の大文字、小文字を区別します。

```
yuutai@tanakayuudainoMacBook-Pro work % find . -name file1
./file1
```
※-printを省略したとしても-printと同じ挙動をします
※ワイルドカードとはLinuxコマンドラインで複数のファイルやディレクトリを操作する際に利用する特殊記号のことを言います。具体的にいうと、アスタリスクとクエスチョンマークが使えます。アスタリスクは任意の文字列に一致した場合検索することができます。一方で、クエスチョンマークは任意の一文字に一致した場合検索することができます。

```
yuutai@tanakayuudainoMacBook-Pro work % find . -name "*file" -print
./file
./new_file
```

● -iname
→ファイル名を指定してファイルを検索します。ファイル名の大文字、小文字を区別しません。

``` 
$ find . -iname readme.md
```
カレントディレクトリの中に入っているファイル名がReadme.mdだったとしても、検索することができます。

● -type
→ファイルの種類で検索

1, -type f
→通常のファイルを検索

```
yuutai@tanakayuudainoMacBook-Pro work % find . -type f -print 
./lll
./file
./new_file
```
通常のファイルが3つ出力されています。

2,-type l
→シンボリックリンクファイルを検索できます

3, -type d 
→ディレクトリを検索できます

● -a 
→複数の検索条件を指定するためのオプションです。

```
yuutai@tanakayuudainoMacBook-Pro work % ls
dir		file_hard	file_s		newdir
yuutai@tanakayuudainoMacBook-Pro work % find . -type d -a -name dir -print
./dir
```
このfindコマンドでは、カレントディレクトリ内でdirという名前のディレクトリを検索してくださいという意味になります。-aは省略が可能です。

## chmod
**chmodコマンド**とはファイルやディレクトリのパーミッションを設定するためのコマンドのことを言います。書式はchmod[ugoa][+-=][rwx]<ファイル名>です。この書式はあるファイルに対し、誰に対して[ugoa]、何を[+-=]、どうするか[rwx]ということを意味しています。

各記号の意味
・誰に対して
| 記号 | 内容|
|:-:|:-:|
| u | 所有者の権限  |
| g |  グループの権限 |
| o |  その他ユーザーの権限 |
| a |  全ユーザーの権限 |

・何を
| 記号| 内容 |
|:-:|:-:|
| + |  権限を追加 |
| -|  権限を削除 |
| =|  記述した権限にする |

・どうする
| 記号| 意味 |
|:-:|:-:|
|  r | 読み取り  |
|  w |  書き込み |
|  x |   実行|

```Linux:具体例
yuutai@tanakayuudainoMacBook-Pro work % chmod u+r file
```
→この具体例では、file　というファイルのユーザー(U)に読み取り(r)権限を追加しますという意味になります。

・数値で指定する方法
書式はchmod<8進数の数値><ファイル名>です。8進数の数値の中身ついて具体的に説明すると、3つの数値を利用して、オーナーとグループそしてその他のユーザーそれぞれに対して与えたい権限を指定するためのものになっています。

```linux:具体例
yuutai@tanakayuudainoMacBook-Pro work % chmod 755 file
```

具体例の中身の詳細
| パーミッション | 数値 | オーナー | グループ | その他 |
|:-:|:-:|:-:|:-:|:-:|
|  r(読み) |  4 | rwx  | r-x  | r-x  |
|  w (書き)| 2  | 4+2+1| 4+1 |  4+1 |
|  x (実行)|  1 |  7 |  5 |  5 |


## ps
実行中のプロセスを表示するためのコマンドです。つまりプロセスの状況を示しています。

・プロセスとは何か？
実行中のプログラムのことをプロセスといいます。

```
PID TTY           TIME CMD
24748 ttys000    0:00.04 -zsh
```
PIDがプロセスIDで、CMDが実行中のコマンドを意味しています。psコマンドを打つことで実行中のプロセスを表示することができます。


### オプション
・aux
→全ユーザーのプロセスを、詳細情報も合わせて表示します。auxは3つのオプションが合わさったものです。xがpsコマンドを実行したユーザーの全てのプロセス、aが全てのユーザーのプロセス、uが詳細情報を合わせて表示するという意味になっています。


※注意点
１、-をつける必要がない
→-をつけないのが主流

## kill
**killコマンド**とはジョブやプロセスを終了させるコマンドのことを言います。書式はkill[オプション]%<ジョブID>、kill[オプション]<プロセスID>です。

```Linux:具体例  
$ kill %1
$ kill 4965
```

※補足
killコマンドはシグナルを送信するコマンドです。

```Linux:具体例
$ kill -<シグナル名>　<プロセスID>
```
デフォルトでTERMという終了を指示するシグナルを送信しています。下記に示した図のそれぞれのコマンドは同じ意味になっています。コマンドを短くしたい場合はkillプロセスIDと書けばOK。

```Linux:具体例
$ kill 4965
$ kill -TERM 4965
```

### killコマンドを使ったとしてもプロセスを終了することができない時
**SIGKILL**とは強制終了させることができるシグナルです。termシグナルを受け付けなくなった場合のみ利用することを推奨します。

```Linux:具体例
$ kill -SIGKILL 4965
$ kill -9 4965
```
→-9のように省略して書くことも可能。


## tail
**tailコマンド**とはファイルの最終行から数行を表示するコマンドです。書式は$ tail ファイル名です。

```Linux:具体例
yuutai@tanakayuudainoMacBook-Pro ~ % tail manual-less
       Mark Nudelman
       Send bug reports or comments to <bug-less@gnu.org>
       See http://www.greenwoodsoftware.com/less/bugs.html for the latest list
       of known bugs in less.
       For more information, see the less homepage at
       http://www.greenwoodsoftware.com/less.



                           Version 487: 25 Oct 2016                    LESS(1)

```
●オプション
・　-n 行
末尾から指定した行を標準出力します。

```Linux:具体例
yuutai@tanakayuudainoMacBook-Pro ~ % tail -n 5 manual-less
       http://www.greenwoodsoftware.com/less.



                           Version 487: 25 Oct 2016                    LESS(1)
```
→5行分だけ出力

・　-c バイト
末尾から指定したバイト分を標準出力します。

・　-fコマンド
変更をリアルタイムでモニタすることが可能になるオプションです。

```Linux:具体例
yuutai@tanakayuudainoMacBook-Pro ~ % tail -f manual-less
See http://www.greenwoodsoftware.com/less/bugs.html for the latest list
       of known bugs in less.
       For more information, see the less homepage at
       http://www.greenwoodsoftware.com/less.



                           Version 487: 25 Oct 2016                    LESS(1)
Hello
kkk
```
tail -f manual-lessと入力し実行することで、指定したファイルが開きます。この時、ファイルの末尾部分が標準出力されますが、シェルに制御が戻りません。そこで新規のターミナルを開き、echo 'iii' >> manual-lessと入力します。

```Linux:新規のターミナル
yuutai@tanakayuudainoMacBook-Pro ~ % echo 'iii' >> manual-less  
```

```Linux:最初に立ち上げたターミナル
                           Version 487: 25 Oct 2016                    LESS(1)
Hello
kkk
iii
```
最初に立ち上げたターミナルを確認すると、iiiの文字データがmanual lessファイルに追加されていることが分かると思います。このようにtail-fはファイルを動的に読み込むことができます。



## chown
**chown**はファイルの所有者を変えるコマンドです。書式はchown ユーザー　ディレクトリ　あるいはchown ユーザー　ファイルのいずれかになります。ユーザーを変更するにはrootユーザーである必要があります。

```Linux:具体例
yuutai@tanakayuudainoMacBook-Pro work % touch yuu
（ファイル作成）

yuutai@tanakayuudainoMacBook-Pro work % ls -l yuu
-rw-r--r--  1 yuutai  staff  0  4 27 11:02 yuu
（現在の所有はyuutai）

yuutai@tanakayuudainoMacBook-Pro work % chown nobody yuu
chown: yuu: Operation not permitted
(一般ユーザーなので変更ができない)

yuutai@tanakayuudainoMacBook-Pro work % su
Password:
sh-3.2# chown nobody yuu
sh-3.2# ls -l yuu
-rw-r--r--  1 nobody  staff  0  4 27 11:02 yuu
sh-3.2# 
（suコマンド　によって要求されたパスワードを打ち込み、rootユーザーに移行。rootユーザーに移行後、chownコマンドによって所有者をnobodyに変更）
```

 # 終わりに
これにて基礎的なコマンド解説は終了です！お疲れ様でした！