`ls` コマンドはなぜこのようにファイルを並べ替えるのでしょうか?

`ls` コマンドはなぜこのようにファイルを並べ替えるのでしょうか?

ls コマンドをリバース エンジニアリングしようとしていたところ、興味深い動作に遭遇しました。、、の 3 つのファイルを作成するとfoo.pngfoopa.pnglsfooqa.pngはそれらをfoopa.png、、foo.pngおよびとして並べ替えますfooqa.png。.gif 拡張子を使用しても試してみましたが、p と q が拡張子の最初の文字とアルファベットの次の文字に置き換えられたときに発生するようです。つまり、の場合です。g と h の場合 ( fooga.gif、その後foo.gif、その後fooha.gif)

なぜ出力がこのように順序付けられるのでしょうか?

答え1

ロケールの照合順序によって異なります。

>LANG=en_IE.UTF-8 ls -1 foo*
foopa.png
foo.png
fooqa.png

>LANG=C ls -1 foo* 
foo.png
foopa.png
fooqa.png

LANG の代わりに LC_COLLATE 変数を使用したり、C ロケールの代わりに POSIX ロケールを使用したりすることもできます。

C の照合順序は、純粋にアルファベット順 (ASCII 順) です。他の照合順序 (英語など) では、スペースやドットなどの特殊文字を区切り文字と見なし、「単語」を個別に処理するか、これらの区切り文字を無視します (ここではそのように思われます)。

非 UTF-8 ロケールでもアルファベット ASCII を使用してソートされることに注意してください。

>LANG=en_IE ls -1 foo*
foo.png
foopa.png
fooqa.png

さらに調べてみると、句読点を無視するのは、次のような Unicode 対応ロケールの一般的な機能であることがわかりました*.UTF-8

関連情報