夜中の2時。本番サーバーがエラーを吐いた。SSHで接続してls -la /var/log/nginxと打つと、画面は真っ白、色なし、50行のログファイルを見ていると目がかすんでくる。cat access.logで内容を確認しようとしたが、こちらも真っ白でハイライトなし。find / -name "nginx.conf" 2>/dev/nullでconfigファイルを探すと、30秒待ってようやく結果が出たが、大量のパーミッションエラーが混ざっていた…
この感覚、共感できる人は多いはずだ。ls・cat・findが悪いわけじゃない――今でも問題なく動く。でも、これらは70年代に書かれたもので、今のターミナル環境とはかけ離れている。
あの経験から、eza、bat、fd-findを使い始めた。Rustでゼロから書き直された3つのツールで、従来の機能はそのままに、色・速度・UXが格段に向上している。この記事では、理屈を並べるより実際のインストールと使い方を紹介する。
実際の現場でのls・cat・findの問題点
会社の古いCentOS 7サーバーで必要なパフォーマンスを得るためにいろいろ最適化してきたが、最初にやったことの一つがこの基本コマンドの置き換えだ。「かっこいいから」ではなく、毎日の作業時間を本当に節約できているからだ。
実際に経験した具体的な問題点:
lsはデフォルトでファイル種別ごとの色分けがなく、git statusの表示もtree viewも使えないcatはテキストをそのまま出力するだけ――syntaxハイライトなし、行番号なし、長いファイルのスクロールにも非対応findはオプションが複雑で(find . -name "*.py" -not -path "*/node_modules/*")、大きなディレクトリでは遅く、パーミッションエラーが結果に混ざって出てくる
基本概念:Unixの古典を置き換えるRust製の3つのツール
eza — モダンなls
ezaはRustで書かれたexaの積極的なフォーク(exaは開発終了)。ファイル種別ごとの色分け(実行ファイル・シンボリックリンク・ディレクトリなど)、ファイル一覧内でのgit status表示、ビルトインのtree view、デフォルトで人間が読みやすいファイルサイズ表示などで、lsを置き換える。
bat — 魂を吹き込まれたcat
batはcatに150以上の言語に対応したsyntaxハイライト・行番号・git diff連携・長いコンテンツの自動ページングを追加したもの。構文はcatとまったく同じ――コマンド名を変えるだけで使い始められる。
fd-find — 泣かせないfind
fd(Debian/UbuntuではパッケージはFD-find)はfindの書き直し版で、構文がはるかにシンプル。デフォルトで.gitignoreと隠しディレクトリを自動除外し、並列実行で明らかに高速。フルカラー表示とUnicodeも完全対応。
実践ガイド
Ubuntu/Debianでのインストール
# ezaのインストール
sudo apt update
sudo apt install eza
# batのインストール
sudo apt install bat
# 注意:Debian/Ubuntuではコマンド名はbatcat(名前の衝突を避けるため)
mkdir -p ~/.local/bin
ln -s /usr/bin/batcat ~/.local/bin/bat
# fd-findのインストール
sudo apt install fd-find
# 同様に、コマンド名はfdfind — 使いやすいようにシンボリックリンクを作成
ln -s $(which fdfind) ~/.local/bin/fd
CentOS/RHEL/AlmaLinuxでのインストール
# GitHub Releaseからezaのバイナリをダウンロード(Rust不要)
EZA_VERSION="v0.19.0"
curl -Lo /tmp/eza.tar.gz \
"https://github.com/eza-community/eza/releases/download/${EZA_VERSION}/eza_x86_64-unknown-linux-musl.tar.gz"
tar -xf /tmp/eza.tar.gz -C /tmp
sudo mv /tmp/eza /usr/local/bin/
# batのバイナリをダウンロード
BAT_VERSION="v0.24.0"
curl -Lo /tmp/bat.tar.gz \
"https://github.com/sharkdp/bat/releases/download/${BAT_VERSION}/bat-${BAT_VERSION}-x86_64-unknown-linux-musl.tar.gz"
tar -xf /tmp/bat.tar.gz -C /tmp
sudo mv /tmp/bat-*/bat /usr/local/bin/
# fdのバイナリをダウンロード
FD_VERSION="v10.1.0"
curl -Lo /tmp/fd.tar.gz \
"https://github.com/sharkdp/fd/releases/download/${FD_VERSION}/fd-${FD_VERSION}-x86_64-unknown-linux-musl.tar.gz"
tar -xf /tmp/fd.tar.gz -C /tmp
sudo mv /tmp/fd-*/fd /usr/local/bin/
バイナリでのインストールの利点:~/.local/binに配置すればroot不要で、CentOS 7のような古いサーバーでも追加の依存関係なしに使える。
lsの代わりにezaを使う
# 基本的なファイル一覧(すぐにカラー表示)
eza
# ls -laと同等
eza -la
# Long format + git status — リポジトリ作業時に非常に便利
eza -la --git
# ビルトインのtree view
eza --tree --level=2
# Long formatのtree、不要なディレクトリを除外
eza --tree --level=3 --ignore-glob="node_modules|.git|__pycache__"
# 更新時刻でソート、新しいものを上に
eza -la --sort=modified --reverse
# ディレクトリを先頭にまとめる
eza -la --group-directories-first
~/.bashrcまたは~/.zshrcにエイリアスを追加:
alias ls='eza --color=auto'
alias ll='eza -la --git --group-directories-first'
alias lt='eza --tree --level=2 --ignore-glob=".git|node_modules"'
alias la='eza -la --group-directories-first'
catの代わりにbatを使う
# syntaxハイライトを自動適用してファイルを表示
bat nginx.conf
bat /etc/ssh/sshd_config
bat app.py
# 複数ファイルを同時に表示
bat *.py
# 別のコマンドへパイプする際は行番号と装飾をオフに
bat --style=plain nginx.conf
# ファイルの一部だけを表示(10〜30行目)
bat -r 10:30 access.log
# batをmanページのページャーとして使う — 最高
export MANPAGER="sh -c 'col -bx | bat -l man -p'"
man nginx
夜中の2時にNginxの設定ファイルを読むために初めてbatを使ったとき、各ディレクティブがカラーハイライトされ、行番号が明確に表示されてエラーの特定が格段に速くなった。些細なことに聞こえるかもしれないが、目がかすんで頭が疲れているときは、色があるだけで本当に助かる。
batのテーマ設定:
# テーマ一覧を表示
bat --list-themes
# 選択前にテーマを試す
bat --theme=Dracula /etc/nginx/nginx.conf
# configでデフォルトを設定
mkdir -p ~/.config/bat
echo '--theme="Dracula"' >> ~/.config/bat/config
findの代わりにfdを使う
# ファイル名で検索 — findよりずっとシンプル
fd nginx.conf
fd "*.log"
# findの等価コマンド: find . -name "nginx.conf"
# 特定のディレクトリ内を検索
fd nginx.conf /etc
# 拡張子で検索
fd -e py # すべての.pyファイル
fd -e log /var # /var内の.logファイル
# 隠しファイルも含めて検索(デフォルトではfdはスキップ)
fd -H ".env"
# 種類で検索:f=ファイル、d=ディレクトリ、l=シンボリックリンク
fd -t f "*.conf" /etc
fd -t d "logs"
# 結果に対してコマンドを実行
fd -e log --older-than 30d /var/log -x rm {}
# 100MBより大きいファイルを検索
fd -S +100M /var
# 過去7日間に変更されたファイルを検索
fd --changed-within 7d -e conf /etc
fdの構文はregexを使うため、fd "access.*log"とするだけでaccess.logとaccess_error.logの両方を一度にマッチできる。findでは別のglobパターンが必要で、ずっと複雑になる。
3つのツールを組み合わせる
本当の力は組み合わせて使うときに発揮される:
# 最近変更されたconfigファイルを検索し、各ファイルの内容を表示
fd -e conf --changed-within 7d /etc | xargs bat
# プロジェクト構造を表示し、buildアーティファクトを除外
eza --tree --level=3 --ignore-glob="node_modules|__pycache__|.git|dist|build"
# TODOを含むPythonファイルを検索し、該当箇所を表示
fd -e py | xargs grep -l "TODO" | xargs bat
# 大きなログを検索し、最後の部分をsyntaxハイライトで表示
fd -S +10M -e log /var/log | xargs -I{} bat -r -100: {}
shellの完全な設定
# ~/.bashrcまたは~/.zshrcに追加
# eza
alias ls='eza --color=auto'
alias ll='eza -la --git --group-directories-first'
alias lt='eza --tree --level=2 --ignore-glob=".git|node_modules"'
alias la='eza -la --group-directories-first'
# bat
alias cat='bat --style=auto'
alias catp='bat --style=plain' # パイプ時はplain
export MANPAGER="sh -c 'col -bx | bat -l man -p'"
# fd(Ubuntu/Debian)
alias fd='fdfind'
# すぐに適用
source ~/.bashrc
まとめ
この3つのツールはワークフローを変えるわけではなく、今やっている作業を快適にするだけだ。ezaはリポジトリ作業中にファイルのgit statusをすぐ確認でき、batはエディタを開かずにconfigやコードを読めるようにしてくれる。fdはファイルを素早く見つけられて、findの複雑な構文を覚える必要もない。
一度インストールしてaliasを設定すれば終わり――インターフェースは既存ツールとほぼ同じなので、何かを学び直す必要はない。次に夜中の2時にインシデントが起きたとき、少なくともターミナルが見やすくなって、少しだけ早くエラーを見つけられる。時にはそれで十分だ。

