Linux勉強会 第5回： ディレクトリ操作とリンクと i ノード  

*この記事は、[株式会社Ancar](https://ancar.co.jp/)で行っている勉強会のおさらい & 外部発信記事として公開されています。

# まえがき
おはこんばんにちは。
社内勉強会第５回目となります。
コロナの影響でリモートでの勉強会となりましたが、負けずに今回もやっていきましょう！！


# おしながき
- ディレクトリ操作 
 - 作業ディレクトリの移動と表示 ( cd , pwd )
 - ディレクトリを行き来する ( pushd , popd )
 - ディスク使用容量を調べる ( du )
 - ディスク容量情報を表示する ( df )
- リンクとiノード  
 - リンクの設定 ( ln )

※macOSの標準ターミナル使用 

# ディレクトリ操作
## 作業ディレクトリの移動と表示 ( cd , pwd )
[第2回](https://qiita.com/onukid007/items/149dd210bd96cd43bb21#%E7%89%B9%E6%AE%8A%E3%81%AA%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E8%A8%98%E5%8F%B7)で触れた内容ですが、おさらいです。
cdコマンド (Change working Directory)： カレントディレクトリの位置を変更するコマンド
pwdコマンド (Print Working Directory)： カレントディレクトリの名称を表示するコマンド

```sh
# 絶対指定で移動する
$ cd /home/una/hoge/fuga

# 現在のディレクトリ表示
$ pwd
/home/una/hoge/fuga

# piyoディレクトリに移動する
$ cd piyo

$ pwd
/home/una/hoge/fuga/piyo
```

パス指定を容易にするために、特殊なディレクトリ記号が存在します。
`~-`は便利なので、学んでからよく利用しています。
もう、`cd ../../`をしなくていいですね...!!

```sh
# 直前のディレクトリに戻る
cd ~-

# ひとつ上(親)のディレクトリに移る
cd ..

# ホームディレクトリに移る
cd ~

# 同上
cd
```


## ディレクトリを行き来する ( pushd , popd )
pushedコマンド： ワーキングディレクトリの履歴をスタック（積み上げ）式に保存し、指定されたディレクトリ移動するコマンド
popdコマンド: 記録された履歴に従い、フォルダを移動する


```sh
$ pwd
/home/una/hoge

# スタック式でディレクトリを積んでいくと....
$ pushd fuga/
~/hoge/fuga ~

# hoge配下に積まれましたね
$ pwd
/home/una/hoge/fuga

# ポップすると....
$ popd
~/hoge ~

# fugaが取り出されたスタック内容になりました
$ pwd
/home/una/hoge


```
恥ずかしながら、今回初めて知ったコマンドでした。
古代コマンドと思いきや、下記の通りコンピュータの根幹を成す大切な働きをしていました。
> スタックは、コンピュータで用いられる基本的なデータ構造の1つで、データを後入れ先出し（LIFO: Last In First Out; FILO: First In Last Out）の構造で保持するものである。
https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF


## ディスク容量情報を表示する ( df )
dfコマンド(Disk Free): ディスクの空き容量を表示するコマンド
後に紹介するduコマンドとセットで利用する機会が多いと思います。

例えば、サーバーがfullに近い状態になったとします。
原因調査をする際に、dfでディスク使用状況を確認し、duでどのファイルがディスクを圧迫しているか調べるという使用方法ができます。


```sh
$ df
ファイルシス         1K-ブロック     使用   使用可 使用% マウント位置
devtmpfs            485712       0  485712    0% /dev
tmpfs               503664       0  503664    0% /dev/shm
tmpfs               503664     624  503040    1% /run
tmpfs               503664       0  503664    0% /sys/fs/cgroup
/dev/xvda1         8376300 1724520 6651780   21% /
tmpfs               100736       0  100736    0% /run/user/1000

# hオプションでは単位を見やすい形にしてくれます
$ df -h
ファイルシス        サイズ  使用  残り 使用% マウント位置
devtmpfs         475M     0  475M    0% /dev
tmpfs            492M     0  492M    0% /dev/shm
tmpfs            492M  656K  492M    1% /run
tmpfs            492M     0  492M    0% /sys/fs/cgroup
/dev/xvda1       8.0G  1.7G  6.4G   21% /
tmpfs             99M     0   99M    0% /run/user/1000
```

## ディスク使用容量を調べる ( du )
duコマンド(Disk Usage) : ディスクの使用領域のサイズを表示するコマンド


| オプション | カスタマイズ内容 |
| :-: | :-- |
| -a | ディレクトリ内の各ファイルの使用量も表示 |
| -b | バイト単位で表示する |
| -k | キロバイト単位で表示する ( デフォルト ) |
| -s | 総計サイズのみ表示する |


```sh
$ du
304	./dir1  #dir1 の総使用サイズ ( 単位キロ )
656	./dir2  #dir2 の総使用サイズ
960	.       #総計サイズ   

#キロバイト単位
$ du -k
152     ./dir1  
328     ./dir2 
480     .

#ディレクトリ全て
$ du -a  
304	    ./dir1
656	    ./dir2
   ~省略~
960	    .  

#総計サイズ
$ du -s
960     .
```




# リンクとiノード  

## リンクの設定 ( ln )
lnコマンド(LiNk): リンクを設定するコマンド

リンクにはハードリンクとシンボリックリンクという2種類の方法があります。

シンボリックリンク: sample_s は sample1 を指す。 sample1 はファイル実体を指す
ハードリンク: 　　　sample_h と sample2 は同じファイル実体を指す


表面的な機能は同じですが、現在は柔軟性のあるシンボリックリンクが主流となっています。
理由は下記の通りです。

- シンボリックリンクはディレクトリのリンクもできる
- シンボリックリンクは別のファイルシステム上のファイルともリンクできる

今回はシンボリックリンクについて触れます。

| オプション | カスタマイズ内容 |
|:-:|:--|
|-s|シンボリックリンクにする ( `-s` がないとハードリンク ) |
|-i|「別名となるパス名」がすでに存在するとき確認実行する |
|-f|「別名となるパス名」がすでに存在するとき強制実行する |


### リンクの設定

```sh
# sampleファイル作成
$ echo This is sample1 > sample1

# シンボリックリンクを設定
$ ln -s sample1 sample_s

# シンボリックリンクを使ってファイル表示
$ cat sample_s
This is sample1
```

### リンク方法の確認

```sh

# リストを見る
$ ls -F
sample1  sample_s@  #@がシンボリックリンクのマーク

# リスト詳細を見る
$ ls -l
total 8
-rw-r--r--  1 una  staff  16  3 10 06:45 sample1
lrwxr-xr-x  1 una  staff   7  3 10 06:45 sample_s -> sample1  #シンボリックリンクはポインタ表示される
```


### ディレクトリ名のリンク

```sh
$ cat hoge/fuga
This is sample3

# hogeのリンクであるpiyoを作る
$ ln -s hoge piyo

# piyoを使ってfugaを表示する
$ cat piyo/fuga
This is sample3
```

### ディレクトリ間のリンク

#### リンク名を現在のディレクトリに作る

```sh
# 同一名のリンクを作る
$ ln -s hoge/sample1 .

# sample2 というリンクを作る
$ ln -s hoge/sample1 sample2

# リンク内容
$ ls -l
lrwxrwxrwx 1 una  staff 12  3月 10 06:55 sample1 -> hoge/sample1
lrwxrwxrwx 1 una  staff 12  3月 10 06:56 sample2 -> hoge/sample1

# 同一名のリンクで表示指定
$ cat sample1   
This is sample1. # hoge/sample1を表示している

# sample2というリンク名で表示指定
$ cat dfile2    
This is sample1. # こちらも同様
```

#### リンク名を異なるディレクトリに作る

```sh
$ cat sample3
This is sample3

# piyo を作っておく
$ mkdir piyo

# 相対パスで指定（絶対パスでも問題なし）
$ ln -sf ../sample3 piyo/sample4

# リンク先
$ ls -l piyo
合計 0
lrwxrwxrwx 1 una staff 9  3月 10 07:01 sample4 -> ../sample3

# 表示ができている..!!
$ cat piyo/sample4
This is sample3
```

リンク設定はlinuxﾁｮｯﾄﾃﾞｷﾙになるためにはマストなコマンドですね。
なんとなく使っていましたが、改めて学習すると新たな気付きが多い....


## まとめ
今回取り上げたコマンドも、基礎コマンドといえると思います。
ただ、日頃利用するコマンドでも知らないオプションや背景などがあり、非常に興味深いものでした。
古代コマンドも知らないだけで、便利な使い方もあるやもしれません。
忘れないためにも、積極的に利用して身体に染み込ませたいと思います！！


## 過去の勉強会のリンクはこちら
- [Linux勉強会 第1回：仮想コンソールとファイル操作](https://qiita.com/yungo/items/8f9cb967f0bd5fa35242)
- [Linux勉強会 第2回：ファイル操作](https://qiita.com/onukid007/items/149dd210bd96cd43bb21)
- [Linux勉強会 第3回：ファイルの削除禁止設定と検索機能](https://qiita.com/kei1111/items/c43d0c8b41e1f76d7a0d)
- [Linux勉強会 第4回：ファイル操作とディレクトリ操作](https://qiita.com/mass-min/items/89d69378f8c91e4895c5)