LANG=en_US.UTF-8だとファイルの並びがおかしくなる。

~ $ mkdir /tmp/a && cd /tmp/a
/tmp/a $ touch 犬
/tmp/a $ touch あ
/tmp/a $ touch 1

まずこんな感じにファイルを作ってen_US.UTF-8で見てみる。

/tmp/a $ LANG=en_US.UTF-8 ls -l
total 4
-rw-r--r-- 1 ken ken  0 Oct 16 06:17 あ
-rw-r--r-- 1 ken ken  0 Oct 16 06:17 1
-rw-r--r-- 1 ken ken  0 Oct 16 06:17 犬

おかしい。これはlsだけでなくデスクトップ上のファイルブラウザも同様だ。ja_JP.UTF-8Cだと思ったように並んでくれるのに……!地味に困るんだけど、今更日本語でLinuxデスクトップなんて使いたくないし、CCでいろいろ不都合が多いので困ったとなるわけ。

LC_COLLATEを使おう

そんなときはLC_COLLATEを使用する。ご存知の通り言語設定は日付や通貨などルールごとにも設定できるようになっているが、並び替えについてもロケールが存在している。なのでこれをCしたり、

/tmp/a $ LC_COLLATE=C ls -l
total 4
-rw-r--r-- 1 ken ken  0 Oct 16 06:17 1
-rw-r--r-- 1 ken ken  0 Oct 16 06:17 あ
-rw-r--r-- 1 ken ken  0 Oct 16 06:17 犬

ja_JP.UTF-8にしてやると、

/tmp/a $ LC_COLLATE=ja_JP.UTF-8 ls -l
total 4
-rw-r--r-- 1 ken ken  0 Oct 16 06:17 1
-rw-r--r-- 1 ken ken  0 Oct 16 06:17 あ
-rw-r--r-- 1 ken ken  0 Oct 16 06:17 犬

いい感じに並んでくれる。各ロケールは/etc/locale.confで指定するので、

LANG=en_US.UTF-8
LC_COLLATE=ja_JP.UTF-8

としておいた。

参考

ロケール - ArchWiki