Linuxでディスク容量をスキャンしてGrandPerspectiveで可視化する話

## はじめに

[GrandPerspective](https://grandperspectiv.sourceforge.net/)は、Mac用の便利なディスク容量可視化ソフトです。Linuxでもファイルをスキャンして、GrandPerspectiveで容量を可視化したいと思ったことはありませんか？LinuxでディレクトリをスキャンしてGrandPerspectiveに互換なファイルを生成するRust製のコマンドラインツール [gpscan](https://github.com/kojix2/gpscan) を作成したので紹介します。

https://github.com/kojix2/gpscan

## ツリーマップ形式でディスク容量を可視化するGrandPerspective

GrandPerspectiveはErwin Bonsmaさんが開発しているMac用のファイル容量可視化ソフトです。SourceForgeから無料でダウンロードできます。（MacのApp Storeでも購入できますが有料です。Erwinさんにカンパしたい人はどうぞ！）

https://grandperspectiv.sourceforge.net/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/0961bcf6-091b-eab2-72ce-8664f6e08b90.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/63492d72-951e-02fc-8407-cd96c2cd8fbd.png)

（[スクリーンショットは公式サイトより](https://grandperspectiv.sourceforge.net/screenshots.html)）

GrandPerspectiveを利用したことがある人は共感していただけると思いますが、このデスクトップアプリは非常に表示が美しく、キビキビと高速に動作します。ディスクを占有しているファイルを特定して、整理するのにとても便利です。

平面上に面積で数量を表現する可視化手法を[ツリーマップ](https://en.wikipedia.org/wiki/Treemapping)と言います。ツリーマップでディスク容量を可視化するツールはGrandPerspectiveだけではありません。それぞれのOSに向けたソフトウェアが開発・公開されています。

Mac | Linux | Windows
-- | -- | --
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/63492d72-951e-02fc-8407-cd96c2cd8fbd.png) | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/46851fd9-cdff-d321-3331-effca14c3b6a.png) | ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/e2c9254b-642e-fad5-c266-92bff0cc7ba3.png)
[GrandPerspective](https://grandperspectiv.sourceforge.net/) | [QDirStat](https://github.com/shundhammer/qdirstat) | [WinDirStat](https://windirstat.net/)

### Linuxのディスク容量をMacで可視化する方法

しかし、Linux（サーバー）のディスク容量を可視化して手元のMacで調査するのは簡単ではありません。

QDirStat（Linux向け）で可視化すればいいと思うかもしれませんが、Linuxサーバーにはデスクトップ環境やQtが入っていないことが多いでしょう。

QDirStatには[Perlスクリプト](https://github.com/shundhammer/qdirstat/tree/master/scripts)が付属しており、ディスクをスキャンすることもできます。しかし、ファイルを可視化する時に、やはりQDirStatが必要になります。有志による[Mac版のQDirStat](https://github.com/jesusha123/qdirstat-macos)もありますが、GrandPerspectiveの使用感には及びません。

そこで、Linuxでディレクトリを走査してGrandPerspective互換のファイルを書き出す単純なコマンドラインツールgpscanを作成しました。

## コマンドラインツール gpscan の紹介

### 概要

gpscanはRustで実装されたコマンドラインツールです。MacのGrandPerspectiveと互換性のあるファイルを出力します。出力されたファイルをローカルのMacにダウンロードして、GrandPerspectiveで開きます。これによりストレージの占有状況を可視化し、サイズの大きいファイルを効果的に見つけて整理することができます。

https://github.com/kojix2/gpscan

### 事前準備 - GrandPerspectiveのインストール

以下の方法のいずれかでインストールします

1. [SourceForge](https://sourceforge.net/projects/grandperspectiv/) からダウンロード
2. [Mac App Store](https://apps.apple.com/jp/app/grandperspective/id1111570163) で購入
3. Homebrewでインストール`brew install grandperspective`

### gpscanのインストール

#### 方法① コンパイル済み実行ファイルを入手する

[GitHub Release](https://github.com/kojix2/gpscan/releases)に置いてある実行ファイルをパスの通っているディレクトリにコピーしてください。`gpscan-x86_64-unknown-linux-musl.tar.gz` と `
gpscan-x86_64-unknown-linux-gnu.tar.gz` がありますが、muslの方が静的にリンクされているのでさまざまな環境で動くはずです。

#### 方法② Rustのcargoパッケージマネージャーを使う

```sh
cargo install gpscan
```

### gpscanの使い方

ホームディレクトリ全体を走査する場合は以下のようにします。

```sh
cd ~/                        # ホームディレクトリに移動
gpscan ./ > result.gpscan    # 現在のディレクトリをスキャンして結果を保存
```

生成されたファイル (`result.gpscan`) はGrandPerspectiveと互換性のあるXML形式のファイルです。SFTP、SCP、Cyberduckなどで手元のMacにダウンロードします。

手元のMacでファイル（`result.gpscan`）を開いてディレクトリの容量を可視化します。

ディレクトリを占有している古いファイル、不要なファイルがあれば、移動・削除することでディスクの容量をコントロールすることができます。

#### コマンドラインオプション

```
  -o, --output <FILE>          Output file (default: stdout)
  -A, --apparent-size          Use apparent size instead of disk usage [false]
  -m, --mounts                 Cross filesystem boundaries during scan [false]
  -z, --include-zero-files     Include zero-byte files in scan [false]
  -e, --include-empty-folders  Include empty folders in scan [false]
  -q, --quiet                  Suppress all informational messages [false]
  -h, --help                   Print help
  -V, --version                Print version
```

#### 開発とライセンス

ライセンスはMITですが、実際にはほとんどのコードとそのコミットメッセージはChatGPTに書いてもらっています。（しかしAIにコードを書いてもらっているとはいえ、実際には方向性を示しながら何回も修正コミットを積み重ねる方式で作っており、制作自体にはそれなりの人手と時間をかけています。）

不具合を見つけた場合は、https://github.com/kojix2/gpscan までイシューもしくはプルリクエストを送っていただけると幸いです。

---

この記事は以上です