lsコマンドで一覧を表示する方法

# この記事を書くきっかけ
ディレクトリにどのファイルが入っているかを表示してくれるlsコマンド。実際によく使用します。しかし、ただ`ls`と打ち込むことがほどんどで、他にlsコマンドでできることをよく知りません。せっかくなので、lsコマンドをうまく使いこなしたいと思い、オプションをまとめてみました。

lsコマンドのオプションは、調べてみるとかなりの量がありましたので、知っておいたら便利そうだな〜と思うものだけをピックアップしました

# lsコマンドの基礎情報 
コマンド：`ls`
説明：ファイルやディレクトリの一覧を表示する
書式：`ls [オプション] [パス]`
用途：ディレクトリの内容を確認するために使用されます。ファイルやディレクトリの詳細情報や属性を表示することができます。
パスの指定：パスを指定しない場合、カレントディレクトリの内容が表示されます。

### lsコマンドのオプション
| option | 説明 |
|:-:|:-|
| -a  | 隠しファイルを含め、すべてのファイルを表示する  |
| -A | 「.」「..」以外のすべてのファイルを表示する|
|-d|ディレクトリそのものの情報を表示する|
|-F|ディレクトリは「/」、シンボリックリンクは「@」、実行可能ファイルは「*」を表示する|
|-G|ファイルやディレクトリを色分けして表示する|
|-h|サイズの単位を表示する（[-l]オプションを同時に指定する）|
|-l|詳細情報を表示する|
|-r|逆順に表示する|
|-S|サイズの大きい順にソートして表示する|
|-s|サイズをブロック単位で表示する|
|-t|修正時刻順にソートして表示する|


# lsコマンド逆引き
### 指定したディレクトリの内容を一覧を表示したい
コマンド：`ls [ディレクトリのパス]`

```
$ ls ~/Documents
project1		report.pdf		notes.txt
project2		data			scripts
```

### ファイルとディレクトリを区別して表示したい
コマンド：`ls -F [ディレクトリのパス]`
```
$ ls ~/Documents
project1/		report.pdf		notes.txt
project2		data			scripts
```

### 隠しファイル（ドットファイル）も含めてすべてのファイルを表示したい
コマンド：`ls -a`
```
$ ls -a ~/Documents
.               ..              .hiddenfile     project1
report.pdf      notes.txt       project2        data
scripts
```
### 「.」「..」はいらないので、それ以外のすべてのファイルを表示したい
コマンド：`ls -A`
```
$ ls -A ~/Documents
.hiddenfile     project1        report.pdf      notes.txt
project2        data            scripts
```
### ファイルやディレクトリの詳細情報を表示したい
コマンド：`ls -l`
```
$ ls -l ~/Documents
total 12
drwxr-xr-x 2 user user 4096 Jan 1 00:00 data
drwxr-xr-x 2 user user 4096 Jan 1 00:00 project1
drwxr-xr-x 2 user user 4096 Jan 1 00:00 project2
-rw-r--r-- 1 user user 2048 Jan 1 00:00 report.pdf
-rw-r--r-- 1 user user 1024 Jan 1 00:00 notes.txt
drwxr-xr-x 2 user user 4096 Jan 1 00:00 scripts
```
### 各ファイル・ディレクトリの詳細の見方
**1. 最初の文字（-）はファイルタイプを示します。**
-: 通常のファイル
d: ディレクトリ
l: シンボリックリンク
c: キャラクターデバイスファイル
b: ブロックデバイスファイル

**2. 次の9文字（はファイルのパーミッションを示します。**
- 最初の3文字：所有者（user）の権限（読み取りr、書き込みw、実行x）
- 次の3文字：グループ（group）の権限（読み取りr、書き込みw、実行x）
- 最後の3文字：その他のユーザー（other）の権限（読み取りr、書き込みw、実行x）
    - ９文字の続きに@や+がある場合。
        - @：ファイルやディレクトリに拡張属性（Extended Attributes）が存在することを示します。
        - +：ファイルやディレクトリにACL（アクセス制御リスト）が設定されていることを示します。

```
-rw-r--r-- 1 user user 2048 Jan 1 00:00 report.pdf
```
この例では、
所有者（user）の権限（rw-）：読み取り（r）、書き込み（w）。実行（x）の権限はない。
グループ（group）の権限（r--）：読み取り（r）のみ。書き込み（w）や実行（x）の権限はない。
その他のユーザー（other）の権限（r--）：読み取り（r）のみ。書き込み（w）や実行（x）の権限はない。

**3. ハードリンクの数**
ディレクトリの場合、この数はそのディレクトリ内のサブディレクトリの数を含むリンクの数を表示します。

**4. 所有者**
**5. グループ**
**6. ファイルサイズ**
**7. 最終更新日時**
**8. ファイル名**
***
### ディレクトリそのものの情報を表示したい
コマンド：`ls -dl`
```
$ ls -dl ~/Documents
drwxr-xr-x 2 user user 4096 Jan 1 00:00 /home/user/Documents
```
### ファイルのサイズの単位を表示したい
コマンド：`ls -hl`
```
$ ls -hl ~/Documents
total 12K
drwxr-xr-x 2 user user 4.0K Jan 1 00:00 data
drwxr-xr-x 2 user user 4.0K Jan 1 00:00 project1
drwxr-xr-x 2 user user 4.0K Jan 1 00:00 project2
-rw-r--r-- 1 user user 2.0K Jan 1 00:00 report.pdf
-rw-r--r-- 1 user user 1.0K Jan 1 00:00 notes.txt
drwxr-xr-x 2 user user 4.0K Jan 1 00:00 scripts
```

### ファイルやディレクトリを色分けして表示したい
コマンド：`ls -G`
```
$ ls -G ~/Documents
data        project1    report.pdf  notes.txt   project2    scripts
```
**一般的な色分けの例**
- **ディレクトリ**: 青
- **シンボリックリンク**: シアン（淡い青）
- **実行可能ファイル**: 緑
- **圧縮ファイル（例：.zip、.tar.gz）**: 赤
- **画像ファイル（例：.jpg、.png）**: マゼンタ（紫）
- **ビデオファイル（例：.mp4、.mkv）**: マゼンタ（紫）
- **通常のファイル**: 白または端末のデフォルト色

### ファイルやディレクトリを名前の逆順に並べ替えてして表示したい
コマンド：`ls -r`
```
$ ls -r ~/Documents
scripts     project2    notes.txt   report.pdf  project1    data
```

### ファイルサイズの大きい順に並べ替えて表示したい
コマンド：`ls -S`
```
$ ls -S ~/Documents
report.pdf  project1    project2    data        notes.txt   scripts
```
ファイルサイズをこのように仮定すると上記のような結果になります。
- report.pdf - 2MB
- project1 - 1.5MB
- project2 - 1.5MB
- data - 1MB
- notes.txt - 512KB
- scripts - 256KB

### サイズをブロック単位で表示したい
コマンド：`ls -s`
```
$ ls -s ~/Documents
3 data       4 project1    6 report.pdf  2 notes.txt   5 project2    1 scripts
```
**前提条件**
- 1ブロック = 512バイト

**ファイルサイズの例**
- data：1500バイト
- project1：2048バイト
- report.pdf：3000バイト
- notes.txt：1000バイト
- project2：2500バイト
- scripts：512バイト
***
**ブロック数の計算**
各ファイルのサイズに基づいて、必要なブロック数を計算します。ファイルシステムはブロック単位でディスクスペースを割り当てるため、ファイルサイズを512バイトで割り、端数が出た場合は切り上げます。

- data：1500バイト
1500 / 512 ≈ 2.93 → 3ブロック
- project1：2048バイト
2048 / 512 = 4ブロック
- report.pdf：3000バイト
3000 / 512 ≈ 5.86 → 6ブロック
- notes.txt：1000バイト
1000 / 512 ≈ 1.95 → 2ブロック
- project2：2500バイト
2500 / 512 ≈ 4.88 → 5ブロック
- scripts：512バイト
512 / 512 = 1ブロック

### 修正時刻順に並べ替えて表示したい
コマンド：`ls -t`
```
$ ls -t ~/Documents
data        project1    report.pdf  notes.txt   project2    scripts
```
**各ファイルの修正時刻の想定**
data：2024年7月5日 14:30
project1：2024年7月5日 14:00
report.pdf：2024年7月5日 13:00
notes.txt：2024年7月4日 18:00
project2：2024年7月3日 20:00
scripts：2024年7月2日 10:00

# まとめ
lsコマンドは`ls`と打ち込む以外に使ってきませんでした。今回、いろんなオプションがあると知りました。特に`ls -a`や`ls -l`は便利だと思います。自分パソコンでいろいろ試してみて、使いこなせるようになりたいと思います。