改めてLinuxコマンドを理解する [cdとlsのオプションについて]

## はじめに
こんにちは！ITスクールRareTECHでCS（Customer Support）を担当している池村です。

```cd```コマンドと```ls```コマンドのオプションと設定周りについてご紹介します。
まだこちらの記事を読んでいない方は、まずこちらの記事を一読お願いいたします。

https://qiita.com/ikemura-ren/items/0925e9fe2e5cd0b47e01?2

※```cd```コマンド、```pwd```コマンド、```ls```コマンドの使い方がわかっている方、絶対パスと相対パスの概念を理解している方は無視していただいて結構です。

※こちらの記事はエンジニアを目指し始めた初学者向けに作成しています。

## ```cd```コマンドの使い方
#### ```~```（チルダ）
まずはチルダですね。```~```はチルダと呼びます。Linuxコマンドにおいてホームを指し示す記号です。

```
cd ~
```
と叩くと、ホームディレクトリに移動します。

ちなみにホームディレクトリに移動するだけなら、チルダをつける必要はなかったりします。不思議ですね。
```
cd
```

ではチルダを使うタイミングはどこなのか？という疑問が浮かぶと思います。

使い所として、まずホームを起点にして移動する時に使います。
```
cd ~/Training
```

上記のコマンドですと、どのディレクトリにいようとホームを起点にして移動することができます。

#### ```-```（ハイフン）
次に```-```（ハイフン）を使った移動を見てみます。
```
cd -
```

これは移動する前にいたディレクトリへ移動することができます。
例えばですが、```/Users/ren/Training/Java```というディレクトリで作業をしていましたが、一度```/Users/ren/Downloads```に移動しました。その後また```/Users/ren/Training/Java```に戻りたいとします。

```
cd ~/Downloads
```
で移動をします。
次に元の```/Users/ren/Training/Java```に戻る時、もちろん絶対パスと相対パスを使った移動の仕方がありますが、以下のコマンドで簡単に移動が可能です。
```
cd -
```
以下の画像でご確認ください。
![cd -での移動の仕方](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/c3f28d1f-758c-ddfd-0a4f-4726156b907a.png)

#### cdでの移動のまとめ
```
cd .  #今いるディレクトリ
cd .. #一つ前のディレクトリ
cd ~  #ホームディレクトリ
cd -  #移動する前にいたディレクトリ
```

こちら基本ですので、覚えておくとgoodです。

## ```ls```コマンドのオプションについて
次に```ls```コマンドのオプションについて解説します。Linuxコマンドのオプションはもちろん網羅していて損はないのですが、初学者が優先すべきは『**このコマンドは何をするコマンドなのか**』を知ることです。
ただ、いくつかのコマンドはオプションの理解が必須の場合があります。```ls```コマンドもその一つと私は思っています。

では早速オプションを見ていきましょう。
#### ```-a```（隠しファイル・ディレクトリを表示するオプション）
```
ls -a
```

こちら実際に私のPC環境上を見てみましょう。
![ls -aの実行結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/d889d64c-edfe-fbc6-f9bc-ac3c32963a6d.png)

こちらホームディレクトリでの実行結果になります。みてみると、先頭に『.（ドット）』がついたファイルやディレクトリがたくさんあります。
※私の環境上で、　白い文字がディレクトリ、灰色の文字のものがファイルになります。

こちらの隠しファイルや隠しディレクトリは、設定ファイルやシステムファイルなどの重要なものが多いです。ですので、誤って消してしまったりすることを避けるため、通常の```ls```コマンドなどでは表示されません。もちろん、ユーザーが直感的に扱えるよう、余計な情報を見せないという意図もあります。画像で分かる通りものすごく多い情報がありますからね。

#### -l（ファイルやディレクトリの詳しい情報も表示するオプション）
```
ls -l
```

こちら、実際に私のPC環境上を見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/aa8dba92-8601-732c-9cd4-96792f185c41.png)

こちらもホームディレクトリでの実行結果になります。それぞれのディレクトリやファイルの詳しい情報が表示されています。初学者は何がなんの情報？と思いますよね？

ではまずディレクトリから見てみましょう。
今回は```Training```ディレクトリを例に見ていきます。
```
drwxr-xr-x@  11 ren  staff   352 10 21 07:46 Training
```

まずは一番左のブロック
```
drwxr-xr-x@
```
##### ```d```（ディレクトリ）
ディレクトリを表します。Trainingはディレクトリです。
##### ```rwx```（ユーザーの権限）
所有者（自分）の読み取り（read）、書き込み（write）、実行（execute）権限を表します。操作している私には、このディレクトリの全ての権限が与えられています。
##### ```r-x```（グループの権限）
Linuxにはグループという概念があり、ユーザーはどこかのグループに所属します。グループごとに権限があり、このディレクトリには読み取り（read）と実行（execute）の権限があるようです。
##### ```r-x```（その他全ユーザーの権限）
作成した本人でもなく、このグループにも所属していないその他のユーザーの権限になります。読み取り（read）と実行（execute）の権限があるようです。

##### ```@```（拡張属性）
これはmacOS特有のメタデータを保存するためのものです。なので、ここでは詳しく解説いたしません。

Linuxのコマンドではこれらの権限周りを変更するコマンドもありますが、今回の記事では説明を省かせていただきます。

次のブロックをまとめて三つ見ていきましょう。
```
11 ren  staff
```
##### ```11```（ハードリンク数）
これはTrainingディレクトリが自身を含めて、どのディレクトリと繋がっているかを表しています。ハードリンクという言葉は、Linuxを学んでいると後ほど出てきますが今は気にしなくて大丈夫です。

##### ```ren```（所有者）
所有者のユーザー名です。私が作っているので当たり前ですね。

##### ```staff```（所属グループ）
このディレクトリの所属しているグループ名です。MacOSでは基本的にこのstaffグループに所属します。Linuxではまた違うグループ名になります。

残りのブロックをまとめて見ていきましょう。
```
352 10 21 07:46 Training
```

##### ```352```（ディスク使用量）
このディレクトリのディスク使用量を表しています。
このディレクトリのメタデータ（作成日時や所有者などの情報、その他）などが含まれます。初学者はあまり気にする必要がないと思っています。

##### ```10 21 07:46```（更新時間）
これはシンプルな情報で、10が更新された月、21が更新された日、07:46が更新された時間です。

##### ```Training```（名前）
ディレクトリの名前ですね。

ここまでが```-l```で表示される情報の詳細です。

ちなみにですが、この二つのオプションはつなげることができます。
```
ls -la
```

こうすると、隠しファイル等もまとめて全部の情報が表示されます。一度コマンドを叩いて確認してみてください。


## 設定ファイルとおすすめ設定について
ここからは、```ls```コマンドと```cd```コマンドについてのおすすめの設定をご紹介します。
まず最初に、シェルの設定ファイルについて理解する必要があります。難しそうに見えますが、慣れてくるとそれほど難しくはない内容です。

Macユーザーならデフォルトはzshになっているはずです。Linuxの環境によってはbashを使っている可能性もありますが、まずは自分の使っているシェルの種類を確認しましょう。
```
echo $SHELL
```

上記のコマンドを叩きますと、今使っているシェルの種類が表示されます。
```
/bin/zsh
or
/bin/bash
```

私のMacではzshなので、zshの設定ファイルをいじっていきます。
まずホームディレクトリに移動していただき、設定ファイルを開きます。今回はVimを使います。
```
vim .zshrc
```

初学者の方は何も書かれていない（そもそもファイルすらない）状態と予想しています。
何も書かれていない前提で話を進めていきます。

#### alias（エイリアス）
まずは```i```を押してVimのインサートモードに入りましょう。
そして以下の文字を記述してみます。
```
alias la="ls -a"
```

上記書けましたら、```esc```を押してVimのノーマルモードに戻ります。
その後
```
:wq
```
と書き込んでEnterです。
これで設定ファイルに書き込みが完了しました。ただ、これだけではシェルに反映されているわけではありません。以下のコマンドを叩く必要があります。
```
source ~/.zshrc
```
ここまでやったら、設定ファイルの反映は完了しました。

まず、この一連の流れを説明します。
1. 設定ファイルを開く
1. 設定ファイルに```ls -a```コマンドを```la```に短縮するエイリアスを書き込む
1. 保存して終了する
1. 設定ファイルをシェルに反映させる

以上です。

alias（エイリアス）はコマンドに別名をつけることができる機能になります。```ls -a```を```la```で叩けるように設定ファイルに書き込んだ形になります。もちろん、これ以外のコマンドもalias設定が可能です。
私が設定しているaliasの一部をご紹介いたします。
```
alias ll="ls -l"          
alias la="ls -a"          
alias lla="ls -la"        
alias rc="vim ~/.zshrc"
alias s_rc='source ~/.zshrc'
```
これ以外にもたくさん登録していますが、```ls```関係のalias、設定ファイルを開く・反映させるaliasだけ載せておきます。これを```.zshrc```に書き込んで保存、反映しておくと便利です。aliasは好みにもよりますので、こっちの方が打ちやすい〜といった好みがありましたらご自身で調整をお願いします。

#### 簡単なシェル関数の紹介
私は```cd```コマンドで移動をした後で、```ls```コマンドを打つことが多いです。毎回```ls```コマンドを打つのは面倒臭いと感じた私が設定ファイルに記述したシェル関数をご紹介します。
```
cd() {
    builtin cd "$@" && ls
}
```
上記の記述を```.zshrc```のファイル内に記述して反映してみてください。
そうすると、```cd```コマンドで移動するごとに勝手に```ls```コマンドを実行してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/1748e9e0-c2ed-9e4a-6ae9-b7ac2961120d.png)

この設定をした後、私は一度も煩わしさを感じたことがないのでオススメしておきます。ぜひ使ってみてください。


#### オススメのツールを紹介
ここまで絶対パスや相対パスでの移動を行なってきたわけですが、毎回これを打つのは面倒ですよね？私はよく行くディレクトリに一瞬で移動したいと考えています。
そこでご紹介するのがzoxideです。

https://github.com/ajeetdsouza/zoxide

このコマンドをインストールすると、ディレクトリの移動がすこぶる楽になります。
Macでのインストール方法は以下になります。
```
brew install zoxide
```
※Linuxの場合はディストリビューションによってパッケージ管理のコマンドが違いますので、Linuxの種類によって使い分けてください。

インストールが完了したら、次に以下をシェル上で叩いてみてください。
```
echo 'eval "$(zoxide init zsh)"' >> ~/.zshrc
```

これを叩くと、```.zshrc```に直接設定を書き込むことができます。パスを通すというアクションをしているわけですが、これに関しては本記事では詳しく解説するつもりはありません。簡単にいうとご自身のシェル上でどこでもこのコマンドを使えるようにしています。

このzoxideはfzfというコマンドも入れると本領を発揮しますので、ここでついでにインストールしておくと吉です。

https://github.com/junegunn/fzf

```
brew install fzf
```
インストールが終了したら、次に以下のコマンドを実行してください。
```
(brew --prefix)/opt/fzf/install
```

fzfはここで詳しくご説明すると長くなってしまうので、簡潔に説明しますと『曖昧検索』を可能にするコマンドです。コマンドを打つと履歴が残ります。これは```Ctrl + R```（Windows）、```control + R```（Mac）で実行できるのですが、それを曖昧検索できるようになります。
何を言っているのかわからない。といった人向けに、私の環境の画像を貼っておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/e6ad883e-3639-57a4-2a44-5cd4ac4862c5.png)
私がdoと打つと、多分このコマンドじゃない？という一覧を出してくれます。この曖昧に検索できるのがとてつもなく便利です。このfzfを利用して、移動も楽にしてしまおうというのがzoxideになります。

```
zi
```
上記のコマンドを打ってみてください。私の見た目とはちょっと違う形で出るとは思いますが、以下のようによく移動しているディレクトリの候補を出してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798971/429b4843-c431-d4bf-2a9d-cf687051d460.png)

もちろん、曖昧検索が可能なので、いきたいディレクトリの候補の文字を少し打つだけで一覧に出現します。それを選んでEnterするだけで、瞬時に移動することができます。

シェルの移動の概念がかなり変わりますのでインストールするのをオススメします！

## おわりに
今回は```cd```コマンドと```ls```コマンドのちょっとした応用について解説しました。
```ls```コマンドに関しては他にもオプションはあるのですが、よく使うものに絞って紹介しています。

初学者は最初この黒い（もしくは白い）画面を見ても何が行われているかわからないと思います。でもまず全ての基本は```cd```コマンドと```ls```コマンドです。これを使いこなして、シェル操作を爆速にしていきましょう！

次の記事は`cat` `touch` `echo`コマンドについて初学者向けに解説します。
次の記事はこちら👇

https://qiita.com/ikemura-ren/items/85fc8bc46d286cca3e01?1

まとめ記事はこちら👇

https://qiita.com/ikemura-ren/items/3e7b6ec1b0cd9b3928d6