3 ポイント 投稿者 GN⁺ 2024-07-23 | 1件のコメント | WhatsAppで共有
  • 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 になかった機能が多数含まれている
    • exa 2021 で導入された “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:%M2023-09-30 13:00 形式で出力する
    • 詳しい書式文字列は eza(1) マニュアルページと chrono documentation を参照
  • マニュアルページは リポジトリの man ディレクトリ で見られ、バージョン [0.18.13] - 2024-04-25 以降はターミナルで man eza としても利用できる

テーマのカスタマイズ

  • eza は最近 theme.yml ファイルのサポートを追加した
  • theme.yml では LS_COLORSEXA_COLORS 環境変数で使えていた既存のテーマオプションを指定できる
  • ファイルタイプや拡張子ごとに 異なるアイコン を指定するオプションも提供する
  • 既存の環境変数が設定されていれば後方互換性のため引き続き動作し、優先される
  • 事前作成済みテーマは公式の eza-themes リポジトリで確認したり、直接貢献したりできる
  • サンプルテーマファイルは docs/theme.yml にある
  • テーマファイルは EZA_CONFIG_DIR 環境変数で指定したディレクトリに置くか、デフォルトでは $XDG_CONFIG_HOME/eza から探される
  • 詳細は eza_colors-explanation.5.mddocs/theme.yml にある

貢献

1件のコメント

 
GN⁺ 2024-07-23
Hacker News のコメント
  • ディレクトリ一覧での人間が読みやすい日付が特に気に障る
    昨日の午前11時ごろにフォルダへコピーしたものを探しているのに、全部「1 day ago」と表示されても役に立たない。日付と時刻が必要で、HN のようなフォーラムも同じく、正確な日時を表示したうえで、必要なら「7 hours ago」を併記すればよい
    なぜわざわざ情報を削るのか理解できないし、無限スクロールのような流れの結果なのか気になる

    • 同意。GitHub もコミットで「foo.cpp modified last year」のように表示するが、追加の日付/時刻情報を見る方法がないならまったく意味がない
    • サイトはこの用途に HTML タグを使えるのではないかと思う。人間が読みやすい形式を選ぶとしても、実際の時刻を残しておけば、拡張機能が置き換えたり上書きしたりできる
      HTML を書くときはいつも使うようにしている
      (https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ti...)
    • 本当に驚くべきアンチ機能だ。切り替わるタイミングも曖昧。「1 day ago」はいつ「2 days ago」になるのか? Google 基準では48時間後なので、47時間後に見ると「1 day ago」と表示され、昨日起きたことのように勘違いしてしまう
      ある日付を友人の誕生日の翌日だと覚えていて何かの項目を探そうとしても、表示が「three months ago」だけなら、1か月分の資料を掘り返さなければならない
    • これは設定なので、好みの日付形式に変更できる
    • この方式は嫌いだ。Web 2.0 スタートアップから始まったか、その頃に Google のような企業の Web アプリ/ソーシャル Web アプリで広まったのだと思う
      詳細な時刻を先に提供し、望むなら「何日前」の表示も併せて提供すればよい
  • lsdもあるが、それでもやはり eza のほうが好きだ
    興味のある人向けに、最近は昔ながらのツールの代わりに使っているモダンなコマンドラインツールがある。bat は構文ハイライト付きの catdifftastic はより良い diffgdu は SSD 向けの ncduzoxide はモダンな cdfdfind の代替、rgripgrepfzf はファジー検索ツール、jless はマウスで折りたためる JSON ビューア、dra はリリースアセットのダウンロード/インストール、lazygit は Git TUI、lazydocker は Docker TUI、yazi は画像プレビュー付きのファイルマネージャ、zellij はより良い tmux/screenstarship は複数のシェルで使えるプロンプト設定ツールだ

    • よく使うツールをさらに4つ追加すると、task は Makefile の代替、hyperfineベンチマークツールvegeta は負荷テストツール、sd はより良く直感的な sed
      JSON 三銃士もある。jq はよく知られた JSON プロセッサ、jc はさまざまな CLI ツールの出力を JSON に変換し、gron は JSON を grep しやすくしてくれる
    • fdrg はデフォルトで .gitignore に含まれる項目を無視する点に注意が必要だ。単純な find の代替品だと思っていると驚くかもしれない。関連する議論は [0] にある
      こうしたツールを勧めるときは、この点を明確に伝えるべきだ。ドキュメントを読まないと見落としやすい。個人的には、この種の代替 coreutils 系ツールは、デフォルトを元のツールにもっと近く保ってほしい。「find のシンプルで高速、ユーザーフレンドリーな代替」と宣伝するなら、新規ユーザーの驚きを減らすために元のデフォルトを尊重すべきだ。エイリアスは存在するのだから、~/.${SHELL##*/}rcalias 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
    • こうしたツールの大半が Rust で書かれている点がいい
    • zellijscreen より良いとは感じなかった。タブ/画面番号がきちんと振られず、直接切り替えるには自分で数えなければならないので、これは受け入れがたい
  • GNU ls はメンテナンスされている。ls.c ファイルに影響するコミットは 2024-06-24 と 2024-06-27 にもあり、1か月も経っていない
    GNU Coreutils のメーリングリストもかなり活発だ。このプロジェクトは「maintained」を「活発に開発されている」という意味で使っているようだ

    • ここで言っているのは、eza がフォークした exa のことを指しているようだ。exa は、リポジトリへの書き込み権限を持っていた唯一の人物が正式に deprecated 表示を付けるまで、約1年間メンテナンスされていなかった
      いまではフォークされてからもかなり経っており、誰もが exa を知っているわけではないので、この表現の意図もずっと不明瞭になっている。同じような反応があるなら、文言を更新する時期だと思う
    • ここでの「maintained」は、ls がメンテナンスされていないという意味ではなく、もはやメンテナンスされていない ls 代替品 exa のフォークとしてメンテナンスされている代替品という意味だ
  • fish シェルに切り替えてから、ls の使用量が 100% 減った。組み込みの Alt + l コマンドがディレクトリの内容を表示してくれるので非常に便利で、シェル履歴もよりすっきりした

    • Bash でも ls のようなコマンドを HISTIGNORE 環境変数に追加すれば、履歴をよりきれいに保てる: https://superuser.com/questions/232885/can-you-share-wisdom-...
    • 良いヒントだ。fish で ls の使用の大半をなくしたのは、ディレクトリを変更したときに自動で ls を実行するようにした設定だった
      function ls_on_cd --on-variable PWD
      ls
      end
    • Bash ユーザーもこのようにショートカットキーをバインドできる。右手のホームローのキーを __bash_ctrl_n() のような関数にまとめておき、dotfiles の各種ツールがこれらの関数を上書きするようにしている。たとえば Git がインストールされていれば、__bash_ctrl_e()git statusgit log を実行するように設定する
    • 自分の環境では、おそらく lseza にエイリアスしているせいで、この機能が eza を実行しているようだ。結局、単に ls を実行しているように見える
    • ls の実行の大半が cd の直後だと気づいて、起動ファイルに追加した。今ではほぼすべての cd が自動で ls を実行する
      Bash では cd() 関数で builtin cd "$@" && ls -l を呼び出し、fish では builtin cd $argv の後、エラーがなくホームへの移動でない場合に dir を実行するようにしている
  • ファイルの種類や属性を区別するために色を強制する端末ツール全般が不便だ。ディストリビューションの ls もそのように設定されていることが多いが、そうした設定は消してデフォルトを使っている
    目に優しい端末背景を使っているのだが、こうした カラースキーム は常に背景と衝突するか、見づらい色を含んでいる。ls やその代替品の出力に色は不要で、ls -AFC が与えてくれる程度で十分だ

    • ツールが任意の “256 color” や “RGB” カラーモードではなく Base16 Framework[0] を使えば、ずっと問題は少なくなるはずだ。出力は端末で定義された、読めると期待される色で表示されるからだ
      [0] https://github.com/chriskempson/base16
      [1] https://tinted-theming.github.io/base16-gallery/
    • 私はまったく逆で、色付きの出力にかなり依存している
      それでも解決策はあるべきで、$NO_COLOR に何らかの値を設定すればよい。https://no-color.org
      この環境変数を確認し尊重しないツールには、バグレポートを出すのが十分に妥当だ
    • https://no-color.org
    • vivid[1] を使って端末背景に合うテーマを選び、生成された LS_COLORS 変数をシェルにロードすればよい
      [1]: https://github.com/sharkdp/vivid/
  • README に ezaexa のフォーク だと書かれていないのは変だ

    • “eza features not in exa” とはあるので、存在自体には触れている。ただしリンクや文脈はない
  • GNU ユーティリティの新しいバージョンが、なぜこんなに多く MIT ライセンス で作られているのか気になる。かなり多いように見える

    • Rust ユーザーは全般的に、コードを パーミッシブライセンス で公開する傾向がある。簡単に確認できる統計があるかは知らないが、Rust のパッケージリポジトリである crates.io のほぼすべてが MIT か Apache-2.0 で、人気ライブラリは確実にそうだと思う
    • GNU プロジェクトが ls を発明したわけではない。ls を含む GNU coreutils も、もともとはプロプライエタリな AT&T ユーティリティや BSD ライセンスのユーティリティの新しいバージョンだった
    • 関連して、https://github.com/uutils/coreutils は「GNU coreutils のクロスプラットフォームな Rust 再実装」だ
  • ls の代替品に、なぜ KerberosSSH が必要なのか?
    ldd /usr/bin/eza を見ると、libgit2libgssapi_krb5libmbedtlslibssh2libkrb5libcryptolibzstd など、かなり多くのライブラリにリンクされている

    • よりによって ls に必要なものとしては、依存関係 が多すぎる
  • QWERTY キーボードでは、eza は 3 文字の組み合わせとしてかなりひどい。ls の利点のひとつは、非常に素早く打てるキーの組み合わせであることだ
    エイリアスは作れるだろうが、互換性などの理由で少し変に感じる

    • 2015 年ごろから eza、その前は exalslllll にエイリアスしてきたが、互換性の問題 に遭遇したことはない
      sl もインストールして、打ち間違えないよう自分を訓練している
    • Dvorak ユーザーの立場では、eza は改善に見える。Dvorak で ls は QWERTY 基準だと p- なので、どちらも右手の小指のキーだ
    • エイリアス設定がなぜ変なのか、もう少し説明してもらえる?
    • 好きな名前で何にでもエイリアスを作れる
    • こういうときは AZERTY キーボード が輝く
  • どうせ誰が ls なんて使うの? 必要なファイルが出てくるまでタブ補完するだけでしょ
    冗談はさておき、なぜ ls がもうメンテナンスされていないと主張しているのか気になる

    • ls ではなく、もうメンテナンスされていない exa[0] を指しているように見える
      [0]https://github.com/ogham/exa
    • どういうわけか、ソフトウェアが定期的に更新されていないと本質的に時代遅れだと考えるのが標準のようになってしまった
    • 当然ながら ls はシェルまたは coreutils の一部としてメンテナンスされている
      ただし ezaexa の派生で、私の知る限り exa はもうメンテナンスされていない
    • 既存のツールがメンテナンスされていないように見せるために、「maintained」と「actively developed」を意図的に混同しているのだ