web-dev-qa-db-ja.com

なぜ `ls`コマンドはこのようにファイルをソートするのですか?

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

なぜ出力をこのように並べるのですか?

33
mooncat39

それはあなたのロケールの照合順序に依存します:

>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

さらに掘り下げてみると、句読点を無視することは、*.UTF-8などのUnicode対応ロケールの一般的な機能のようです。

52
xenoid