Eza: モダンでメンテナンスされている `ls` 代替ツール
(github.com/eza-community)- eza は Unix/Linux のファイル一覧コマンド
lsを置き換えるモダンな CLI ツールで、より多くの機能とより優れたデフォルト設定を提供することを目指している - ファイルタイプとメタデータを 色 で区別し、シンボリックリンク・拡張属性・Git 情報を認識し、小さく高速な 単一バイナリ として提供される
- 従来の
exaと比べて Grid Bug の修正、ハイパーリンク、マウントポイントの詳細情報、SELinux コンテキスト、Git リポジトリの状態、人間に読みやすい相対日付、セキュリティ修正、brightターミナルカラー、theme.yml設定が追加されている - Windows、macOS、Linux でインストールでき、Nix flake 環境では
nix run github:eza-community/ezaでビルドして実行できる lsとほぼ同じだが完全には同一ではないオプション体系を持ち、表示・フィルタリング・長い一覧・テーマ設定を通じてファイル一覧の出力方法を細かく調整できる
eza が提供する ls 代替体験
- eza は Unix および Linux オペレーティングシステムに含まれる古いファイル一覧コマンド
lsのモダンな代替である - 基本目標は、
lsより 多機能で使いやすい バージョンを提供することにある - ファイルタイプとメタデータを色で区別する
- シンボリックリンク、拡張属性、Git 情報を認識する
- 小さく高速で、単一バイナリ として提供される
exa と比べて追加された機能
- eza には
exaになかった機能が多数含まれているexa2021 で導入された “The Grid Bug” の修正- ハイパーリンク 対応
- マウントポイントの詳細情報表示
- SELinux コンテキスト表示
- Git リポジトリの状態表示
- 人間に読みやすい相対日付
- 複数のセキュリティ修正
brightターミナルカラー対応- 細かなバグ修正と変更
- 色とアイコンをカスタマイズする
theme.yml設定ファイル
実行とインストール
- Nix flake 対応環境では、次のコマンドで eza を試せる
nix run github:eza-community/eza
- Nix は eza をビルドしてから実行する
- 引数を渡すには、次のように
--の後ろにオプションを付けるnix run github:eza-community/eza -- -ol
- eza は Windows、macOS、Linux で利用できる
- プラットフォームおよびディストリビューション別のインストール方法は INSTALL.md にある
コマンドラインオプション構成
- eza のオプションは
lsとほぼ同じだが、完全に同じではない -
表示オプション
-1,--oneline: 1 行に 1 項目ずつ表示-G,--grid: 項目をグリッドで表示し、これがデフォルト-l,--long: 拡張詳細と属性を表示-R,--recurse: ディレクトリを再帰的に探索-T,--tree: ディレクトリをツリー形式で再帰表示-F,--classify=(when): ファイル名の横にタイプ表示子を出力--colour=(when),--color=(when): ターミナルカラーを使うタイミングを指定--icons=(when): アイコンを表示するタイミングを指定--hyperlink=(when): 項目をハイパーリンク表示するタイミングを指定--absolute=(mode): 項目の絶対パス表示方式を指定
-
フィルタリングオプション
-a,--all: 隠しファイルとドットファイルを表示-d,--treat-dirs-as-files: ディレクトリを通常ファイルのように一覧表示-L,--level=(depth): 再帰の深さを制限-s,--sort=(field): ソート項目を指定--group-directories-first: ディレクトリを先に表示--group-directories-last: ディレクトリを後に表示-D,--only-dirs: ディレクトリのみ表示-f,--only-files: ファイルのみ表示--git-ignore:.gitignoreにあるファイルを無視-I,--ignore-glob=(globs): パイプ区切りの glob パターンに一致するファイルを無視--allを 2 回渡すと.と..ディレクトリも表示する
長い一覧と Git 関連情報
--longまたは-l使用時に長い一覧オプションを利用できる- ファイルサイズと権限に関するオプションを提供する
-b,--binary: バイナリ接頭辞でファイルサイズを表示-B,--bytes: 接頭辞なしでバイト単位のファイルサイズを表示-o,--octal-permissions: 権限を 8 進数形式で表示--no-permissions,--no-filesize,--no-user,--no-time: 各フィールドの出力を抑制
- ファイルシステムとメタデータに関するオプションを提供する
-H,--links: ハードリンク数を表示-i,--inode: inode 番号を表示-M,--mounts: マウント詳細を表示、Linux と macOS でのみ利用可能-Z,--context: セキュリティコンテキストを表示-@,--extended: 拡張属性とサイズを表示--total-size: 再帰ディレクトリサイズを表示
- Git 関連の出力にも対応する
--git: 追跡対象または無視された各ファイルの Git 状態を表示--git-repos: 追跡対象の各ディレクトリの Git 状態を表示--git-repos-no-status: ディレクトリが Git リポジトリかどうかだけを表示し、より高速--no-git:--git,--git-repos,--git-repos-no-statusを常に無視して Git 状態出力を抑制する
- 時刻形式は
default,iso,long-iso,full-iso,relative, または+<FORMAT>形式のカスタム指定をサポートする- 例:
+%Y-%m-%d %H:%Mは2023-09-30 13:00形式で出力する - 詳しい書式文字列は
eza(1)マニュアルページと chrono documentation を参照
- 例:
- マニュアルページは リポジトリの man ディレクトリ で見られ、バージョン
[0.18.13] - 2024-04-25以降はターミナルでman ezaとしても利用できる
テーマのカスタマイズ
- eza は最近
theme.ymlファイルのサポートを追加した theme.ymlではLS_COLORSとEXA_COLORS環境変数で使えていた既存のテーマオプションを指定できる- ファイルタイプや拡張子ごとに 異なるアイコン を指定するオプションも提供する
- 既存の環境変数が設定されていれば後方互換性のため引き続き動作し、優先される
- 事前作成済みテーマは公式の eza-themes リポジトリで確認したり、直接貢献したりできる
- サンプルテーマファイルは
docs/theme.ymlにある - テーマファイルは
EZA_CONFIG_DIR環境変数で指定したディレクトリに置くか、デフォルトでは$XDG_CONFIG_HOME/ezaから探される - 詳細は eza_colors-explanation.5.md と docs/theme.yml にある
貢献
- eza に貢献するには code of conduct に従う必要がある
- 実際の開発参加に関する情報は CONTRIBUTING.md にある
1件のコメント
Hacker News のコメント
ディレクトリ一覧での人間が読みやすい日付が特に気に障る
昨日の午前11時ごろにフォルダへコピーしたものを探しているのに、全部「1 day ago」と表示されても役に立たない。日付と時刻が必要で、HN のようなフォーラムも同じく、正確な日時を表示したうえで、必要なら「7 hours ago」を併記すればよい
なぜわざわざ情報を削るのか理解できないし、無限スクロールのような流れの結果なのか気になる
HTML を書くときはいつも使うようにしている
(https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ti...)
ある日付を友人の誕生日の翌日だと覚えていて何かの項目を探そうとしても、表示が「three months ago」だけなら、1か月分の資料を掘り返さなければならない
詳細な時刻を先に提供し、望むなら「何日前」の表示も併せて提供すればよい
lsdもあるが、それでもやはり eza のほうが好きだ興味のある人向けに、最近は昔ながらのツールの代わりに使っているモダンなコマンドラインツールがある。
batは構文ハイライト付きのcat、difftasticはより良いdiff、gduは SSD 向けのncdu、zoxideはモダンなcd、fdはfindの代替、rgはripgrep、fzfはファジー検索ツール、jlessはマウスで折りたためる JSON ビューア、draはリリースアセットのダウンロード/インストール、lazygitは Git TUI、lazydockerは Docker TUI、yaziは画像プレビュー付きのファイルマネージャ、zellijはより良いtmux/screen、starshipは複数のシェルで使えるプロンプト設定ツールだtaskは Makefile の代替、hyperfineはベンチマークツール、vegetaは負荷テストツール、sdはより良く直感的なsedだJSON 三銃士もある。
jqはよく知られた JSON プロセッサ、jcはさまざまな CLI ツールの出力を JSON に変換し、gronは JSON をgrepしやすくしてくれるfdとrgはデフォルトで.gitignoreに含まれる項目を無視する点に注意が必要だ。単純なfindの代替品だと思っていると驚くかもしれない。関連する議論は [0] にあるこうしたツールを勧めるときは、この点を明確に伝えるべきだ。ドキュメントを読まないと見落としやすい。個人的には、この種の代替 coreutils 系ツールは、デフォルトを元のツールにもっと近く保ってほしい。「find のシンプルで高速、ユーザーフレンドリーな代替」と宣伝するなら、新規ユーザーの驚きを減らすために元のデフォルトを尊重すべきだ。エイリアスは存在するのだから、
~/.${SHELL##*/}rcにalias fd='fd --ignore'を置くほうが、alias fd='fd --no-ignore'より良いと思うTips として、エイリアスが適用されていない版を使いたければ
\commandを使えばよい。例えばalias grep='grep --color=always --no-messages --binary-files=without-matchを使っているが、色付けオプションが文字表現を変えてしまい、curlにパイプするとエラーになることがある。すべてのパイプでそうなるわけではないが、初めて遭遇するとかなり面食らう。echo "Hello world" | \grep --color=always "Hello" | hexdumpのあと!!:s^always^neverで確認できる[0] https://github.com/sharkdp/fd/issues/612
https://github.com/ibraheemdev/modern-unix
zellijがscreenより良いとは感じなかった。タブ/画面番号がきちんと振られず、直接切り替えるには自分で数えなければならないので、これは受け入れがたいGNU ls はメンテナンスされている。
ls.cファイルに影響するコミットは 2024-06-24 と 2024-06-27 にもあり、1か月も経っていないGNU Coreutils のメーリングリストもかなり活発だ。このプロジェクトは「maintained」を「活発に開発されている」という意味で使っているようだ
ezaがフォークした exa のことを指しているようだ。exaは、リポジトリへの書き込み権限を持っていた唯一の人物が正式に deprecated 表示を付けるまで、約1年間メンテナンスされていなかったいまではフォークされてからもかなり経っており、誰もが
exaを知っているわけではないので、この表現の意図もずっと不明瞭になっている。同じような反応があるなら、文言を更新する時期だと思うlsがメンテナンスされていないという意味ではなく、もはやメンテナンスされていないls代替品exaのフォークとしてメンテナンスされている代替品という意味だfish シェルに切り替えてから、
lsの使用量が 100% 減った。組み込みの Alt + l コマンドがディレクトリの内容を表示してくれるので非常に便利で、シェル履歴もよりすっきりしたlsのようなコマンドをHISTIGNORE環境変数に追加すれば、履歴をよりきれいに保てる: https://superuser.com/questions/232885/can-you-share-wisdom-...lsの使用の大半をなくしたのは、ディレクトリを変更したときに自動でlsを実行するようにした設定だったfunction ls_on_cd --on-variable PWDlsend__bash_ctrl_n()のような関数にまとめておき、dotfiles の各種ツールがこれらの関数を上書きするようにしている。たとえば Git がインストールされていれば、__bash_ctrl_e()がgit statusとgit logを実行するように設定するlsをezaにエイリアスしているせいで、この機能がezaを実行しているようだ。結局、単にlsを実行しているように見えるlsの実行の大半がcdの直後だと気づいて、起動ファイルに追加した。今ではほぼすべてのcdが自動でlsを実行するBash では
cd()関数でbuiltin cd "$@" && ls -lを呼び出し、fish ではbuiltin cd $argvの後、エラーがなくホームへの移動でない場合にdirを実行するようにしているファイルの種類や属性を区別するために色を強制する端末ツール全般が不便だ。ディストリビューションの
lsもそのように設定されていることが多いが、そうした設定は消してデフォルトを使っている目に優しい端末背景を使っているのだが、こうした カラースキーム は常に背景と衝突するか、見づらい色を含んでいる。
lsやその代替品の出力に色は不要で、ls -AFCが与えてくれる程度で十分だ[0] https://github.com/chriskempson/base16
[1] https://tinted-theming.github.io/base16-gallery/
それでも解決策はあるべきで、
$NO_COLORに何らかの値を設定すればよい。https://no-color.orgこの環境変数を確認し尊重しないツールには、バグレポートを出すのが十分に妥当だ
vivid[1] を使って端末背景に合うテーマを選び、生成された LS_COLORS 変数をシェルにロードすればよい[1]: https://github.com/sharkdp/vivid/
README に
ezaがexaのフォーク だと書かれていないのは変だGNU ユーティリティの新しいバージョンが、なぜこんなに多く MIT ライセンス で作られているのか気になる。かなり多いように見える
lsを発明したわけではない。lsを含む GNU coreutils も、もともとはプロプライエタリな AT&T ユーティリティや BSD ライセンスのユーティリティの新しいバージョンだったlsの代替品に、なぜ Kerberos と SSH が必要なのか?ldd /usr/bin/ezaを見ると、libgit2、libgssapi_krb5、libmbedtls、libssh2、libkrb5、libcrypto、libzstdなど、かなり多くのライブラリにリンクされているlsに必要なものとしては、依存関係 が多すぎるQWERTY キーボードでは、
ezaは 3 文字の組み合わせとしてかなりひどい。lsの利点のひとつは、非常に素早く打てるキーの組み合わせであることだエイリアスは作れるだろうが、互換性などの理由で少し変に感じる
eza、その前はexaをls、ll、lllにエイリアスしてきたが、互換性の問題 に遭遇したことはないslもインストールして、打ち間違えないよう自分を訓練しているezaは改善に見える。Dvorak でlsは QWERTY 基準だとp-なので、どちらも右手の小指のキーだどうせ誰が
lsなんて使うの? 必要なファイルが出てくるまでタブ補完するだけでしょ冗談はさておき、なぜ
lsがもうメンテナンスされていないと主張しているのか気になるlsではなく、もうメンテナンスされていない exa[0] を指しているように見える[0]https://github.com/ogham/exa
lsはシェルまたは coreutils の一部としてメンテナンスされているただし
ezaはexaの派生で、私の知る限りexaはもうメンテナンスされていない