100日後にエンジニアになるキミ - 12日目 - サーバー - コマンドついて1

サーバーについて学んだら
サーバーを操作するためのコマンドについて
学習してみましょう。

# コマンドとは

コマンドとはCUI(character user interface)や
CLI(command line interface)で
コンピューターを操作するための文字列です。

通常コンピューターには
マウスやキーボードでの操作の他に
コマンドで操作を受け付ける仕組みが備わっています。

Windowsでは「コマンドプロンプト」
MacやLinuxでは「ターミナル」
などでコマンド操作をすることができます。

ここではLinux(MacOS)コマンドベースで
話を進めていきます。

## コマンドを動かしてみる

コマンドを打ち込むにはソフトウェアを起動します。

Windowsであれば「コマンドプロンプト」を起動します。

![p1-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/db828bae-59d0-c669-571a-3e89b84df344.png)

MacOSなどであれば「ターミナル」を起動します。

<img width="891" alt="スクリーンショット 2020-04-01 17.45.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/2c94a0ee-fce4-5c9f-9af2-8c032153e4b1.png">

画面を開くと文字が打てる様になるので
ここでコマンドを打ち込んでみましょう。

コマンドの入力の仕方は

文字列を打ち込んで「エンターキー」を押す、です。


画面表示では
`・・・・・$`
の様に表示されていると思います。

$マークの後にコマンドを打ち込むことができますので
何も考えず下記のコマンドを打ち込んで実行してみましょう。

`pwd`

さて結果は？

```
$pwd
/Users/ユーザー名
```

の様にディレクトリの名前が表示されたのではないでしょうか。

pwdコマンドは現在いるディレクトリのパス(位置)を出力するコマンドです。

コマンドの実行では今いる場所がとても重要になります。

## コマンドの種類

コマンドには色々な種類があります。
色々試しながら覚えていきましょう。

**ls**

現在いる場所にどんなファイルやディレクトリがあるのかを
調べるコマンドです。

自分が今いる場所はユーザーディレクトリの中にいました。
その中にあるディレクトリなどが表示されます。

`ls`

`ls オプション ファイルやディレクトリ`

```
$ls
Applications
Applications (Parallels)
Desktop
Documents
Downloads
```



コマンドではオプションと言って
コマンドの機能を拡張する文字列を加えられます。

`ls`コマンドのオプションは

-aオプション：すべて表示
`ls -a`

-lオプション：ファイルの詳細も表示する
`ls -l`

-1オプション：リストを縦に並べる
`ls -1`

-rオプション：逆順で表示する
`ls -r`

-tオプション：更新時間順に並べる
`ls -t`

-Sオプション：ファイルサイズ順でソートする

-hオプション：単位を読みやすい形式で表示する
`ls -h`

他にもまだありますがよく使うものだけ押さえておけば良いでしょう。

`ls ディレクトリ名`
とすることで、今いる場所の配下のディレクトリの中を調べることができます。

絶対パスで調べることもできます。
`ls パス`

**cd**

今いる場所から移動するコマンドです。

`cd ディレクトリ`

現在のディレクトリ内から Desktop ディレクトリに移動する場合は

```
$ pwd
/Users/ss/

$ cd Desktop/

$ pwd
/Users/ss/Desktop
```

pwdコマンドと併せてどこにいるのかを確認しながら
操作するディレクトリを移動することができます。

ホームディレクトリへの移動は

`cd`
`cd ~`
だけで移動することができます。

一つ上の階層に移動するには

`cd ..`

二つ上の階層の場合は

`cd ../..`

cdコマンドで最も意識したいのは
相対パスで指定するのか絶対パスで指定するのかです。

今いるところからを基準にする場合と
ルートディレクトリからの絶対的なパスで考えるのかで
コマンドの書き方が変わってきますので
押さえておきましょう。

**mkdir**

ディレクトリを作成するコマンドです。

`mkdir ディレクトリ名`

```
$ mkdir dir0001

$ ls -ls
total 0
0 drwxr-xr-x  2 ss  staff  64  4  1 18:22 dir0001
```

作成した後にlsコマンドなどで確認してみると
ディレクトリが作られていることを確認できます。

**rmdir**

`rmdir ディレクトリ名`

ディレクトリを削除するコマンドです。
ファイルは削除できません。

```
$ rmdir dir0001
```

**cp**

ファイルなどをコピーするコマンドです。

`cp オプション コピー元のパス コピー先のパス`

```
cp aaa.csv ../aaa.csv
```

オプションが沢山あります。

|オプション|内容|
|:--|:--|
| -a | 元ファイルの構成と属性を保ったままコピー |
| -f | 強制的にコピー |
| -i | 上書き時に確認 |
| -p | コピー元のファイルの所有者、グループ、パーミッション、タイムスタンプを保持する |
| -r | ディレクトリを再帰的にコピーする。ディレクトリ以外のファイルはすべてファイルとしてコピーされる |
| -R | ディレクトリの内容を再帰的にコピーする |
| -u | コピー先ファイルのタイムスタンプが同じか新しい場合はコピーしない |
| -v | コピーする前にそのファイル名を表示する |
| -x | 異なるファイルシステム上のサブディレクトリはコピーしない |

**rm**

ファイルを削除します。

`rm オプション ファイル名`

-fオプション:強制削除
`rm-f ファイル名`

-iオプション:削除時に確認
`rm -i ファイル名`

-fオプション:ディレクトリの内容を再帰的に削除
`rm -f ファイル名`

**mv**

ファイルを移動します。

`mv オプション 移動元のパス 移動先のパス`

-fオプション:強制的に移動
`mv -f ファイル名`

-iオプション:移動時に確認
`mv -i ファイル名`

**cat**

ファイルの中身を見るコマンドです。

`cat ファイル名`

ファイルの中身が少ない時は良いですが多い時は大変なので
プレビューする場合は次のheadコマンドなどを用います。

**head**

ファイルの先頭部分を表示するコマンドです。

`head オプション ファイル名`

デフォルトは10行分のみ表示します。

```
$head -5 aaa.csv
0
1
2
3
4
```

**tail**

ファイルの末尾部分を表示するコマンドです。

`tail オプション ファイル名`

デフォルトは10行分のみ表示します。

```
$tail -5 aaa.csv
96
97
98
99
100
```

headとともに `-行数`を指定することで表示行数を制御できます。

**grep** 

コマンドラインに表示されたものの中を検索するコマンドです。

`grep 検索文字列`

他のコマンドの結果とともによく用いられ
コマンドを`|`で連結できます。

```
$ls -ls | grep App
0 drwx------@  4 ss  staff   128  3  1 20:09 Applications
0 drwxr-xr-x@  4 ss  staff   128  3  1 20:09 Applications (Parallels)
```

こうすると `ls` の結果の中から `grep`で必要な部分だけ
抽出することができます。

ファイルの中身などから抽出も出来るので、自然言語処理などにも応用できます。

**wc**

テキストファイルの文字数や行数を数えるコマンドです。

`wc オプション ファイルなど`

```
$wc -l aaa.csv
100
```

-lオプション:改行の数を数える
`wc -l`

-mオプション:文字数を数える
`wc -m`

## まとめ

コンソールを用いたコマンドの使い方を試して
コマンドの利用に慣れておこう。

ある程度コマンド利用が出来る様になったら
オプションを調べてみて
色々な操作が行える様になろう。

まだまだコマンドはいっぱいあるので
少しづつ覚えていこう。


君がエンジニアになるまであと88日

## 作者の情報
乙pyのHP：
http://www.otupy.net/

Youtube：
https://www.youtube.com/channel/UCaT7xpeq8n1G_HcJKKSOXMw

Twitter：
https://twitter.com/otupython