ls -ltr を打ったら怒られた。インフラエンジニアなら条件反射で打つあのコマンドが、eza に乗り換えた途端に動かなくなった。
何が起きたか
dotfiles に alias ls='eza' を書いて、eza に切り替えた。ls、ls -l、ls -la あたりは普通に動くのでしばらく問題ないと思っていた。
ある日 ls -ltr を打ったらエラーになった。
$ ls -ltr eza: Option --time (-t) has no "r" setting (choices: modified, changed, accessed, created) To sort oldest files last, try "--sort oldest", or just "-sold"
-t の意味が ls と違うのでエラーになります。eza だと -t はタイムスタンプ表示フィールドの指定で、ソートではないんですよね。
ちなみに eza はエラー時に代替コマンドをサジェストしてくれます。上の例でも -sold を提案してくれている。
原因
eza はソートオプションの設計が ls と根本的に違う。
ls はフラグを並べてソートを指定する方式。-t で更新時刻順、-S でサイズ順、-r で逆順、という具合に組み合わせる。
eza は -s FIELD(正式には -s old のようにスペースあり、または --sort=old)でソートフィールドを明示的に指定する方式に変わっている。正式なフィールド名は name, size, modified, accessed, created 等で、old や new は modified のエイリアスとして使える。-r(--reverse)も正式オプションとして組み合わせ可能。
なお -sold のようにスペースなしの書き方も現行バージョンでは動くので、本記事ではこの短縮形を使っている。
eza の -t はソートではなくタイムスタンプ表示フィールドの指定なので、ls と同じ感覚で -ltr と打つとエラーになる。
ただしこれが気づきにくい。ls、ls -l、ls -la は完全に動く。-ltr のような複合オプションを打って初めてエラーになる。さらに厄介なのは eza -lS のように「エラーにならないけど意味が違う」ケースもあること。eza の -S はソートではなくブロックサイズ表示なので、静かに別の動作になる。
対策
3つの方法がある。
方法1: エイリアスを追加する
一番手っ取り早い。よく使うコマンドをそのまま eza に変換したエイリアスを dotfiles に書く。
alias lt='eza -l -sold' # ls -ltr 相当(古い順 = 最新が下) alias ln='eza -l -snew' # ls -lt 相当(新しい順 = 最新が上)
lt で打てば ls -ltr と同じ動作になる。筋肉記憶を上書きするよりも、新しいコマンドを覚えるほうが早い。
方法2: バックスラッシュで本物の ls を呼ぶ
\ls -ltr
先頭に \ を付けるとエイリアスを無視して、パスに入っている元の ls が呼ばれる。たまにしか使わない複合オプションはこれで逃げるのが楽。
方法3: eza ネイティブのオプションを覚える
長期的には eza の作法に慣れるのが筋。-s でフィールドを指定する、という設計を把握しておくと応用が効く。
eza -l -sold # 更新時刻の古い順(ls -ltr 相当) eza -l -snew # 更新時刻の新しい順(ls -lt 相当) eza -l -ssize # ファイルサイズ順(ls -lS 相当)
対応表
よく使う ls のソートオプションと eza の対応。
| ls コマンド | eza コマンド | 並び順 |
|---|---|---|
ls -ltr |
eza -l -sold |
更新時刻の古い順(最新が下) |
ls -lt |
eza -l -snew |
更新時刻の新しい順(最新が上) |
ls -lSr |
eza -l -ssize |
ファイルサイズの小さい順 |
ls -lS |
eza -l -ssize -r |
ファイルサイズの大きい順 |
ls -lX |
eza -l -sext |
拡張子順(GNU ls 限定) |
ls -ltu |
eza -l -saccessed |
アクセス時刻順 |
-sold の old は「一番古いものが先頭」という意味。結果として最新ファイルが一番下に来る。ls -ltr と同じ見え方になる。
まとめ
eza への切り替えは mise で入れて alias 1行書けば終わりなので導入は楽。ただしソートオプションの設計が変わっているので、-ltr 系を条件反射で打つ習慣があると詰まる。
エイリアスで lt='eza -l -sold' を追加しておけば、筋肉記憶に逆らわず運用できる。