[はじめてのLinux]Linuxコマンドの種類

Linuxコマンドの種類とどういった処理をするコマンドなのかについて書いていきます。
また、Linuxコマンドを使用する際に、CLIという物を使っていくのでコマンドを入力していく前にCLIについて説明をしていこうと思います。

#CLIとは
```[Command Line Interface] コマンドラインインターフェース```の略
例えばファイルを開いたり、特定のディレクトリに移動したりといった操作をキーボードでコマンドと呼ばれる文字列を入力し、その文字列を実行する事によって行う物。
![スクリーンショット 2021-03-08 11.01.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933264/62d37ba9-9f3d-6def-f4fa-c6c06bcab05b.png)
日頃やっているファイルのアイコンをクリックしてそのファイルに移動する、ファイルを削除する時にそのファイルの上で右クリックをしてゴミ箱に入れるをクリックしてファイルを削除というのは```GUI([Graphical User Interface] グラフィカルユーザーインターフェース)```と言う物を使用して操作している。

#GUIと比較した時のCLIを使うメリット
* 操作がGUIより軽快にできる
    * 例えば特定のファイルがある場所まで移動したいという状況の時、そのファイルがディレクトリの奥深くにある場合だとGUIだとディレクトリをクリックして、またその中にあるディレクトリをクリックしてというのを繰り返さないとそのファイルのある場所までたどり着かないけど、CLIなら一つのコマンドでそのファイルのある場所まで移動が出来る
    * ファイル数が膨大にある場合、特定の名前のファイルを探すのがGUIだと大変だけど、CLIだとコマンドをくみ合わせる事で探すことが可能。
* 複数の処理を組み合わせで同時に行う事が出来る。
    * GUIだと一つ一つマウスでクリックして行っているような作業がCLIだとパイプラインという物を使う事でコマンドを組み合わせて同時に実行する事が出来る。

#CLIを使うデメリット
* 最初は覚えるのが大変
    * GUIだと直感で操作できるが、CLIだとコマンドを入力して実行する事で処理を行うので```どのコマンドを実行するとどういった処理が出来るか```というのを覚えるまでが大変
 
#コマンドの種類と処理の内容
これから出てくるターミナルというのはコマンドを入力して実行する為の黒・もしくは白の画面の事
##echo
画面に文字を出力する

```php:ターミナル
echo "こんにちは"
こんにちは
```
##pwd (print working directory)
自分が今いるディレクトリを表示する

```php:ターミナル
pwd
ここにディレクトリのパスが表示される
```

##ls (list)
今いるディレクトリにあるファイルを表示する

```php:ターミナル
ls
表示されたファイル名　表示されたファイル名　表示されたファイル名　
```

Linuxコマンドにはオプションという補助機能のような物をつける事も出来る

```php:ターミナル
ls -a #ファイル名が.(ドット)から始まる隠しファイル(見えないようになっているファイル)も表示出来る
```
```php:ターミナル
ls -l #ファイルの詳細(所有者やファイルの編集権限も表示出来る)
```

```php:ターミナル
ls -la #隠しファイルを含めた全てのファイルの詳細を表示)
```

##cd (Change Directory)
違うディレクトリに移動する

```php:ターミナル
cd ../　#一つ上の階層に移動
cd ../../ #二つ上の階層に移動
cd ./ディレクトリ名 #同じ階層の別のディレクトリに移動
cd ディレクトリ名　#cd ./ディレクトリ名と同じ処理

cd ~/ #ホームディレクトリ(サーバに接続した時にいるディレクトリに移動
cd /ディレクトリ名/ディレクトリ名 #絶対パスで指定(ルートディレクトリを基準とする)
```

###階層やルートディレクトリとは
![DlvWDxGG.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933264/fb204e4b-a1d1-6acc-53aa-4be64e2447dd.jpeg)
ディレクトリは、一番上にあるルートディレクトリを基準に下に枝分かれしている(階層構造という)
ホームディレクトリというのはサーバに接続した時にいるディレクトリの事を指す

##mkdir (Make Directory)
ディレクトリを作成する

```php:ターミナル 
mkdir ディレクトリ名 #指定したディレクトリ名のディレクトリを今いる場所に作成
mkdir ~/ディレクトリ名 #ホームディレクトリに指定したディレクトリ名のディレクトリを作成
```

##cat
ファイルの中身を表示する。
サーバの中の設定ファイル等を編集せずに中身だけみたい時に使われたりする。
(編集をしないからvimエディタで開いて見る必要がないのとvimエディタで開いた場合誤操作をした時に設定ファイルの中身を変えてしまう可能性がある為)


```php:ターミナル
cat ファイル名　#指定したファイルの中身を表示
```

##cp (Copy)
ファイルをコピーする

```php:ターミナル
cp コピー元のファイル名　コピー先のファイル名
#コピー先に指定したファイルが無ければ新規にファイルを作り、あればコピ元のファイルの中身に上書きする
cp コピー元のファイル名　ディレクトリ名
#指定したディレクトリの中にコピー元のファイルをコピーする
```

##mv (Move)
ファイルを移動する。移動先が同じディレクトリならファイル名変更の処理をする

```php:ターミナル
mv 移動元のファイル　移動先のファイル名もしくはディレクトリ名
mv 移動元のファイル1 移動元のファイル2 移動先のディレクトリ
#移動元のファイルは複数選択する事が出来る。
```
##rm (remove)
ファイルの削除をする。
また、ディレクトリは通常のrmコマンドでは削除出来ない。
```(`ディレクトリ名' を削除できません: ディレクトリです```といエラーが出る

```php:ターミナル
rm ファイル名　#指定したファイルを削除する
rm -r ディレクトリ名 #-rをつけるとディレクトリに入っているファイルも一緒に削除できる
rmdir ディレクトリ名 #ディレクトリを削除するLinuxコマンド。ただしディレクトリにファイルがあるとがエラー出る
```
##touch 
タイムスタンプの更新
ファイルがなければ空ファイルが生成される

```php:ターミナル
touch ファイル名
```

##grep
正規表現を使って指定したファイル内に指定した文字列を含む行を表示する

例えば

```php:ターミナル
ls #ファイル一覧を表示
linux.php
cat linux.php #linux.phpの中身を表示

テスト
楽しい
テストは楽しい
#linux.phpの中身

grep "テスト" linux.php　#linux.phpの中に「テスト」という文字列を含む行があるかを調べる
テスト
テストは楽しい
#あるとこんな感じで「テスト」を含む行の文字列が返ってくる
```
実務だとログファイルと呼ばれる数万行あるファイルの中に特定のユーザidが含まれているかを調べる時にも使ったりするらしいです。

##パイプライン
>パイプとは、コマンドの標準出力を次のコマンドに渡す処理のことをいいます
```https://webkaru.net/linux/commands-pipeline/```より引用

標準出力とはざっくり言うとコマンドの実行結果の事。
パイプラインを使って複数のコマンドを組み合わせると一つの処理として実行することが出来る。

使用例

```php:ターミナル
ls #ファイル一覧を表示

#実行結果
form.php  form2.php  greeding.php  hello  linuxform.php  test.php  test2.php

 ls | grep "form" #lsコマンドの実行結果をgrepコマンドに渡す。

#実行結果
form.php
form2.php
linuxform.php
#ls | grep "form"を実行するとファイル名にformという文字列のついたファイルを表示する
```
##リダイレクト
>出力先を変える物 
https://products.sint.co.jp/topsic/blog/standard-input-output　より引用

標準入力: データの取得元(何も設定を変えなければキーボードからデータを取得する)
標準出力: データの出力先(ターミナルやファイル)

例

```php:ターミナル
echo "こんにちは"
#実行結果
こんにちは
#この場合は標準入力はキーボード、標準出力はターミナル

cat greeding.php
#実行結果
こんばんわ
#この場合は標準入力はファイル(greeding.php)、標準出力はターミナル

#リダイレクトを使って実行。greeding.phpの中身をgreeding2.phpに出力する
cat greeding.php > greeding2.php

#greeding2.phpの中身を確認
cat greeding2.php
#実行結果
こんばんわ

cat greeding.php >> greeding2.php
# >>はファイルの最後の行に中身を追加する。
# ファイルに既に中身がある場合、>だと内容を上書きし、>>だと上書きせず最後の行に中身を追加する

#grepコマンドと組み合わせる事も出来る
#cat.php内の猫という文字列を含む行を探し、その行をconfirm_cat.phpの中に書き込む

grep "猫" cat.php > confirm_cat.php

#cat.phpの中身
cat cat.php
これは猫
あれも猫
こっちは犬
あっちはうさぎ
それは猫

#confirm_cat.phpの中身
これは猫
あれも猫
それは猫
```
実務ではgrepコマンドとリダイレクトを組み合わせて、ログファイルの中身を別のファイルに写し変えてじっくり見るために使ったりすることもあるそうです

以上になります！
ここまで読んで頂きありがとうございます！