lsコマンドで表示されるファイル名一覧を色分けする！

最近、LPIC（Linux）の勉強をしているので、その成果をアウトプットしたいと思います！

今回は`ls`コマンドに焦点を当て、ファイルの種類によって名前の色分けを行います。

## 完成図
ファイルの種類（通常ファイルかディレクトリか）によって名前の色が区別されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643639/296d7313-f1eb-d3a7-ac4f-25a6b5efa496.png)



## 前提
`ls`コマンドを単体で実行すると、以下のようにカレントディレクトリ（今自分がいるディレクトリ）にあるファイルやフォルダの一覧を表示させることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643639/43c5d26f-28c5-9b31-d59c-4113b9448f52.png)


`ls`コマンドの引数に相対パスや絶対パスでディレクトリ名を指定することで、そのディレクトリにあるファイルやフォルダを参照することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643639/ef60f8d4-03ff-53e2-406a-4ae08b20fcf3.png)

しかし、ディレクトリの中身一覧は見れても、名前だけでそれがファイルなのかフォルダなのかを判別することができません。
`ls`コマンドでオプションに`-l(小文字エル)`を付けると判別は付けられるのですが、それもわかりづらいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643639/945a23d3-f431-7591-a781-8e23a7cf6266.png)


ちなみに赤線の部分の'd'がディレクトリ'-(ハイフン)'が通常のファイルとなります。

そこで、`ls`だけで既に色付きで表示されていたらわかりやすいのでは？
ということでその手順を解説していきます！！

## 手順
まず現在使っているシェルがbashかzshによって手順が変わってきますので、どちらを使用してるか確認から行います。
コマンドライン上で`echo $SHELL`を入力すると、どちらかを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643639/886d1325-a4ff-7df9-2344-3a74660ec3be.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643639/9318b125-8e97-1551-14bc-3258e6504c02.png)

`echo`は変数の中身をコマンドライン上に表示させることができるコマンドです。
`$SHELL`変数には今使っているシェルが格納されているので、それをechoコマンドで表示させた形です。

そしてbashの場合は最初から名前が色分けをされている可能性があります・・・笑
（ちなみに、MacBookは標準がzshとなっており、標準搭載されているターミナルもzshです。）

### bashを使っている場合
確認を行います。
`alias`を入力して以下のような記述があれば既に色分けされているということになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643639/8f6a4321-8bf6-90db-0206-dba624afd16d.png)

`alias`コマンドは頻繁に使用するような長いコマンドや忘れやすいものを、自分の好きな文字列としてコマンドを実行できるようにするものです。
画像では、既に`ls`コマンドは`ls --color=auto`コマンドの別名として登録されているので、普通に`ls`を実行しても色分けがされた状態というわけです。
（aliasを使ったコマンドはまた余裕があれば後日書き起こします！）

ちなみにzshかbashかを確認した理由は`ls`コマンドは同じなのですが、名前に色を付けるオプションの指定の仕方が変わってくるので、例えば`ls --color=auto`をzsh上で入力するとエラーになります。

### zshを使っている場合
MacOSはzshが標準です。
`ls`コマンドで名前に色を付けるオプションは`-G`になります。

#### おすすめ度：☆
つまり、`ls -G`を入力することで、カレントディレクトリ内にあるファイルやフォルダが種類によって色分けされて表示されます。

#### おすすめ度：☆☆
上のやり方だと毎回`ls`とセットで`-G`オプションを打たなければいけないので、bashと同様に`alias`コマンドを使って`ls -G`をデフォルトにしてしまいます！
 次のように`alias ls='ls -G'`を入力することで、`ls`コマンドが`ls -G`の別名として登録されました。`alias`コマンドを単体で入力して実行すると、現在登録済みのaliasが一覧で表示され、その中に`ls='ls -G'`も表示されているかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643639/3c9c609c-c396-60ae-4bdb-792f30558786.png)

逆にaliasに登録はしたけど、初期設定のlsを使いたいという場合は、`\ls`のようにバックスラッシュの後にそのコマンドを入力し実行することで、初期のコマンドとして扱われます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643639/12a6a22f-d491-ecf6-7756-25cdfae078a8.png)

#### おすすめ度：☆☆☆
上のやり方だと`ls`コマンドが`ls -G`をデフォルトにすることはできましたが、実はコマンドライン（ターミナル）を閉じてしまうと設定が初期化されてしまいます。なので、立ち上げるたびに毎回`alias ls='ls -G'`をaliasに登録しなくてはなりません。
そこで、このやり方ではターミナルを起動した時に最初から`alias ls='ls -G'`を読み込ませる方法です！
まずは`ls -A ~(チルダ)`を入力してファイルとディレクトリの一覧を確認します。
`-a`オプションは隠しファイルも含めて全て表示します。`-A`は`-a`からカレントディレクトリの'.(ドット)'と一つ上の階層の'..(ドット2つ)'を除いた全てのディレクトリになります。どちらのオプションを使うかは好みの問題です・・・笑
ちなみに隠しファイルはファイル名が'.(ドット)'から始まるファイルで、通常の`ls`コマンド単体では表示がされず、通常はファインダー(またはエクスプローラー)からも目視することはできません。
`ls`コマンドの引数に`~(チルダ)`を指定していますが、これはホームディレクトリを表していて、ホームディレクトリには現在ターミナルを使ってるユーザーの初期設定に関するファイルが隠しファイルとしていくつか存在し、その中の.zshrcが今回必要になるファイルになります。
この.zshrcファイルの中身はターミナル起動時に自動で読み込まれるので、今回必要な`ls`コマンドのalias設定はこの中に書いておくようにします。
まずは`cat ~/.zshrc`を実行し、現在の.zshrcの中身を確認しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643639/6792b4e1-0227-1393-d3e6-443312d01320.png)

`cat`コマンドは引数に指定したファイルの中身をターミナル上に表示させることができます。
引数の`~/.zshrc`は`~/`がホームディレクトリ、`.zshrc`がホームディレクトリにあるファイルを指します。
もし既に何か設定が書かれてある場合は念の為スクリーンショットをしておくか、メモなどにコピペしておくか、または`cp ~/.zshrc ~/Desktop(どこでもいいです。)`で.zshrcファイルを別の場所にコピーしておいてください。.zshrcは隠しファイルなので、デスクトップにコピーしたとしても実際に表示されることはありません。（Desktopへのコピーがちゃんとできているか確認したい場合は`ls -A ~/Desktop`で.zshrcが表示されていればOKです。万が一の時はこのファイルを元の位置にある.zshrcと入れ替えて復元を行います。）
`cp`コマンドは第一引数にコピー元、第二引数にコピー先を指定します。（`cp コピー元 コピー先`）
これからこの設定ファイルを触っていくので、何かあっても復元できるようにしておきます。（追記するだけなので大丈夫だとは思いますが念の為）

メモ・スクショ・コピペのいずれかが終わったら`vi ~/.zshrc`を実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643639/b49237d9-15a7-290f-9ba7-82002c7e0699.png)

viエディタの使い方を少し。
この画面はターミナルに搭載されているviエディタというものでいわゆるVimです。
保存せずに終了させるには`:q!`を入力しエンターを押すことで元のコマンドライン（ターミナル）に戻ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643639/320efed6-4125-fc6c-04a1-55e8ce0783ea.png)

もう少し踏み込みます。
先ほどと同様に`vi ~/.zshrc`を実行します。
次に'i'を押すとコマンドモードからINSERTモードに切り替わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643639/a230bfb7-27b3-01fe-e5eb-237ff7285256.png)

INSERTモードに切り替わると左下の文字が'-- INSERT --'になるかと思います。INSERTモードに入ると、実際にキーボードから文字の入力や削除ができるようになります。
viエディタを終了させるには、先ほど`:q!`で終了できると言いましたが、この`:q!`はコマンドモードで入力する必要があるため、viエディタを閉じるにはINSERTモードからコマンドモードに一度戻す必要があり、それがキーボードの'esc(エスケープ)'キーになります。
'esc'を押すと'-- INSERT --'の文字が消え、`:q!`を入力すると左下に表示され、エンターキーで実行すると編集内容を保存せずにviエディタを閉じることができます。

では実際にaliasを追記し保存していきます。
INSERTモードに切り替え、一番下の行に`alias ls='ls -G'`を記述します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643639/d81a2011-6495-030c-0546-2fc129078107.png)

上下にある'# >>> aliases >>>'と、'# <<< aliases <<<'はコメント行なのでなくても大丈夫ですが、書いておくと後から見やすいかもです。

次に保存を行います。
保存は終了する時と同じコマンドモードで行う必要があるので、'esc'キーを押してINSERTモードからコマンドモードに切り替えます。
先ほどは保存せず終了`:q!`でしたが、今度は保存して終了をします。
保存して終了のコマンドは`:wq!`になります。（他にも`ZZ(大文字)`などもありますが、一旦`:wq!`で大丈夫です。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643639/a5815ed8-bc63-1c77-f172-5b02bae7ea30.png)


そして、.zshrcの内容を書き換えた場合はターミナルを再起動するか、.zshrcファイルを実行しないと書き換えた内容が反映されません。
実行するには`source ~/.zshrc`を実行することで、設定内容が即時に反映されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643639/37bcff8d-e513-ba40-1a3b-e25592812ee3.png)

コマンドライン上では`alias`コマンドは入力しませんでしたが、alias一覧を見ると、先ほど書き込んだ内容が反映されていて、実際にlsコマンドを実行してみるとファイル名が変わっているのがわかるかと思います。

ちなみに、先ほど念のためDesktopに.zshrcをコピーしていた場合は`rm ~/Desktop/.zshrc`を入力し実行することで、削除できます。
`rm`コマンドはファイルの削除コマンドで、引数に削除したいファイル名またはディレクトリ名（ディレクトリの場合は`-r`オプションが必要）をカレントディレクトリからの相対パスまたはホームディレクトリからの絶対パスで指定することで、ゴミ箱を通さずに完全に削除することができます。（`rm ファイル名（ディレクトリ名）`）

## おわりに
おすすめ度：☆☆☆と言いつつめっちゃ難しいことしてるやんけ！
と思われるかもしれませんが、viコマンドでファイルを編集する機会は多いと思うので、練習と思ってやってみていただけたらと思います！（こじつけ）

今後も機会があれば、今回のように何か一つのコマンドを取り上げて皆様のお役に立ちそうな情報を共有できればと思っています

何か気づかれたことなどありましたらご指摘いただけると幸いです！

最後まで読んでいただきありがとうございました！

[Twitter](https://twitter.com/masao_sasaki_ae)でも技術発信をしているのでよかったら覗いてみてください！