/var/www/yatta47.log

/var/www/yatta47.log

やったのログ置場です。スクラップみたいな短編が多いかと。

eza のソートオプションは ls と違う — ls -ltr の代替方法

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 等で、oldnewmodified のエイリアスとして使える。-r--reverse)も正式オプションとして組み合わせ可能。

なお -sold のようにスペースなしの書き方も現行バージョンでは動くので、本記事ではこの短縮形を使っている。

eza の -t はソートではなくタイムスタンプ表示フィールドの指定なので、ls と同じ感覚で -ltr と打つとエラーになる。

ただしこれが気づきにくい。lsls -lls -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 アクセス時刻順

-soldold は「一番古いものが先頭」という意味。結果として最新ファイルが一番下に来る。ls -ltr と同じ見え方になる。

まとめ

eza への切り替えは mise で入れて alias 1行書けば終わりなので導入は楽。ただしソートオプションの設計が変わっているので、-ltr 系を条件反射で打つ習慣があると詰まる。

エイリアスで lt='eza -l -sold' を追加しておけば、筋肉記憶に逆らわず運用できる。


参考