世界を動かす技術を、日本語で。

「アルファベット順」と言うとき、私は「アルファベット順」を意味します

概要

  • ファイル名の ソート順 が期待通りにならない現象の体験談。
  • 多くの ファイルマネージャ が「自然順ソート」を採用している事実。
  • ファイル名の 微妙な違い がソート順に影響する理由。
  • 問題の 原因特定 と解決方法の発見。
  • 昔ながらの シンプルな挙動 への懐古。

ファイル名ソート問題の体験談

  • 父親と マルチデイハイク を行い、写真を共有フォルダに集約。
  • 両者とも Androidスマートフォン を使用、ファイル名規則は「IMG_YYYYMMDD_HHmmss...jpg」形式。
  • アルファベット順=日付順になるはずと 期待
  • Windows PCで確認したところ、 自分の写真→父親の写真 の順に並ぶ現象発生。
  • Google DriveやKDE Dolphinなど、 他のファイルマネージャ でも同様の並び順。
  • lsコマンド (Linux/Unix系)では期待通りにソートされる。

ソートアルゴリズムの違い

  • 一般的な ファイルマネージャ は「自然順ソート(natural sort)」を採用。
    • 例:file-9.txtの前にfile-10.txtが来るのを 防ぐ ため。
    • 数字部分を 数値として解釈 して並び替える方式。
  • lsコマンドや一部ツールは 純粋なアルファベット順 でソート。
  • ファイル名の アンダースコア有無 や数字の区切り方が、自然順ソートで大きな影響。

原因の特定

  • 父親のスマホは 秒の直後にミリ秒 を連結、筆者のスマホは アンダースコアで区切り
  • 自然順ソート時、 区切りの違い でミリ秒部分が「大きな数字」として扱われ、順序が崩れる。
  • 例:IMG_20250820_092016029_HDR.jpgとIMG_20250820_092832138_HDR.jpgの並び順。

解決策と感想

  • ファイル名を統一 してリネームすることで根本的に解決可能。
  • Dolphinの設定で 自然順ソートを無効化 できるが、設定は深い場所にあり面倒。
  • 全アプリで毎回設定変更は 現実的でない
  • 昔のコンピュータ の「言われた通りに動く」挙動への懐かしさ。

まとめと教訓

  • 自然順ソート が普及した背景にはユーザビリティ向上の意図。
  • しかし、 ファイル名規則の不統一 があると逆に混乱を招く場合も多い。
  • 共有フォルダでは ファイル名付与ルールの統一 が重要。
  • ソートの仕組みを理解し、 必要に応じて設定変更やリネーム を検討することが推奨。

Hackerたちの意見

“特定の言語では、比較が文脈に依存し、単一の文字を直接比較するだけではないという追加の複雑さがあります。 […] 数字については、数値順にソートするためのカスタマイズが必要かもしれません。数字を含む文字列を単にアルファベット順にソートすると、「A-10」が「A-2」よりも前に来てしまうことが多く、これは望ましくないことがよくあります。この動作はカスタマイズ可能ですが、文字列内の数字を認識する際の曖昧さによって複雑になります(なぜなら、異なる言語の規則に従ってフォーマットされることがあるからです)。各数字が認識されると、それを正しい数値ソートができる形式に変換するための前処理が行われます。たとえば、IEEEの数値フォーマットのテキストバージョンなどです。”* このファイルブラウザは正しい選択をしたと思います。この例のように、必ずしも正しいことをするわけではないにしても。

でも、-10は-2より小さいよね?

この記事で紹介されているバージョンソートがほぼ常に欲しいです。「アルファベット順」のソートよりもね。でも、一方で、これが「アルファベット順」として提示されるのは明らかにバグだと思います。「アルファベット/数値」みたいなラベルが必要です。つまり、ソートの問題ではなく、ラベリングの問題です。

そうそう、まさにその通り。説明されている動作は実際に非常に便利なんだよね。問題は、ユーザーに警告もなくオプションもなしにそれを強制することだよ。

でも、これはアルファベット順のソートとして提示されてるわけじゃないよ。著者は名前順がアルファベット順を意味すると思ってたけど、そういうラベルにはなってないんだ。

記事で言ってるソートのことをレキシカルソートって言うけど、問題は人々がバカだってことだよね。普通のユーザーはレキシカルソートとアルファベットソートの違いなんて知らないから。

注目すべきは、Linuxの「sort」のいくつかのバージョンには、今はバージョンソートがあるってことだね。sort -V。内部でどう動いてるか正確には分からないけど、ちょっと魔法みたいなもので、ファイルを探すときはいつも使ってるよ。ほとんどの場合、ちゃんと動くからね。もちろん、オンオフが簡単にできるのもいいところだね。

わかるけど、もし主要なオペレーティングシステムがこの同じ曖昧な状況を同じように扱っているなら、自分のメンタルモデルや期待を再評価する必要があるかもしれないね。私がズレてるのかな?いや、オペレーティングシステムが間違ってるんだよ。数字はアルファベットの一部じゃないから。

これって結構有名なことだと思ってた。例えば、macOSのFoundationライブラリはNSString.localizedStandardCompare()を公開していて、Finderで使われるソートアルゴリズムを実装してるから、ちゃんとしたmacOSアプリはこれを使うべきなんだ。WindowsはStrCompareLogicalを使ってるよ。

lsと同じように動くと思ってたから、この記事は面白かった。でも今は、こっちの方がいいと思うようになった。純粋にアルファベット順でソートする必要があるケースは思いつかないな。ほとんどの写真閲覧アプリでは、写真はファイル名じゃなくてタイムスタンプでソートされるし。もしファイルエクスプローラーでちゃんとソートしたいなら、作成日でソートするだろうし。それがダメなら、ファイル名を正規化するかも。

Microsoft/Google/KDEの順番に賛成だな。著者の状況は非常に稀で、「10」が「9」より前に来ることを望む人の方がずっと多いと思う。それに、デスクトップはこのソートを「アルファベット順」とはラベル付けしてないし(実際には「辞書順」なんだけど)、それを「名前順」とラベル付けしてるから、技術的には嘘をついてるわけじゃない。> コンピュータが自分の言った通りに動いてくれた時代が懐かしい。今は、こっちの考えを読もうとするばかりだ。あの頃を美化して見てるかもしれないけど、私もコンピュータに嘘をつかれるのは嫌だ。でも、「心を読む」って、オートセーブみたいに当たり前のように役立つこともあるんだよね。デスクトップには本当にアルファベット順にファイルをソートするオプションがあってもいいけど、より一般的なケースが常にデフォルトであるべきだと思う。それが「直感的」の定義だよ。

ファイル9がファイル10の前ってこと?マイクロソフトにはちょっと不満があるんだけど、これをユーザーごとに変更できないのがね(下のレジストリキー参照)。ユーザー向けには「ナチュラルソート」って呼んでるけど、内部では論理ソートって言ってるし。用語を統一してよ! [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer] "NoStrCmpLogical"=dword:00000001

ファイルのソートはニッチなユーザーだけのものじゃないよ。テレビエピソードのファイル名ソート(例えばS01e01)が普及してるから、アルファベットソートとちゃんと機能させるために先頭ゼロが必要になってるんだ。

それには同意できないかも。数字の値を表すためのユニークで普遍的な表現があれば納得できるかもしれないけど、数字の値のテキスト表現がたくさんあるから、「心を読む」良さはごく一部のケースにしか通用しないと思う。開発者には直感的かもしれないけど、非技術者にはそうじゃない可能性が高い。例えば、順序は小数点を含む数字を扱えるの?もしそうなら、少なくとも1桁の先頭数字(ゼロ)が必要?a.12345はa.345の前か後ろか?千の区切りはどうするの?国際的な千の区切りや小数点の区切り(例えば、ユーロスタイルの.で千の区切り、,で小数点の区切り)は?科学的表記はどうなるの?もしこれらの質問のいずれかに「いいえ」と答えたら、驚きや混乱を引き起こす可能性が高いよ。最初は合理的で便利に思える機能リクエストでも、要件を詳しく探ると、リクエストを非脆弱な方法で満たすにはエッジケースが多すぎることに気づくんだ。

両方ともサポートされるべきだね。あまり使われない(真の英数字順)ものは、ネストされたメニューの裏にでも置いておけばいいんじゃないかな。でも、考えなくても選べるオプションは必要だよ。

「10」が「9」の前に来る状況は、もっと一般的だよね。たぶん「後に」って言いたいのかな?そうじゃないと、OPに同意してるように見えるけど。 > デスクトップはこのソートを「アルファベット順」ってラベル付けしてないよ(E: 実際には「辞書順」なんだけど)、彼らは「名前順」ってラベル付けしてる(非公式な基準だね)。だから、技術的には嘘をついてるわけじゃないよ。ちなみに、「名前順」の正式な名前は「自然ソート順」だよ。

あなたはその時代をバラ色の眼鏡で見ているかもしれないね。いや、彼が話していることに関しては、その時代自体がバラ色だったよ。

同意だね。それに、先頭にゼロを入れることを学ぶっていう考え方は間違ってるし、実用的じゃないよ。必要な桁数が分からない限りね。バージョン5.9.17から5.10.0に移るときに、既存のフォルダを5.09.17にラベル変更するなんてことはしないでしょ。今の標準的なソート方法は明確で、曖昧さがなくて、自然なものなんだ。レキシコグラフィックにはその役割があるけど、ユーザー向けのインターフェースには向いてないよね。

本当の問題は、驚きと謎があることだと思う。特に「ダメ」なアルファベット順ソートがずっと存在していたからね。99%の一般ユーザーのケースに対して「これを修正した」なら、「厳密なアルファベット順ソート」オプションとは別に「スマートな自然ソート」オプションを作るべきだったよ。シンプルで明白な方が、何十年もの経験がある非技術的なユーザーにとっても驚くような違いにはならないから。

まあ、どうやらこれらのオペレーティングシステムは、ユーザーがあまりにもバカだから、アルファベット順が何を意味するか理解できないって決めたみたいだね。だから、ファイルをアルファベット順にソートしてって頼んでも、そうはならない。ファイル名の一部が数字だったら、実際の数値を使うことに決めるんだ。いや、実際にはアルファベット順でソートしてって頼んでるわけじゃない。「名前でソートして」って頼んでるだけで、それは彼らの解釈に任されてる。で、彼らはユーザーが求めてると思われる解釈を選ぶんだ。もしかしたら、将来のOSでは、数字のグループに先頭ゼロがあったら、実際のアルファベット順に戻すルールが追加されるかもね。あるいは、設定可能なオプションを用意するかも。(もしかしたら、すでにいくつかはそうしてるかも。)

彼らはユーザーが求めてると思われる解釈を選ぶんだ。そうだね、それは理解できるけど、問題はその解釈が過去10年(15年?20年?)で変わったってことだよね。「名前でソート」って言ったら、ほとんどのファイルマネージャーでは「名前で、アルファベット順/レキシカル順」って意味だったのに。

明らかに先頭のゼロは、その数字が8進数であることを意味するよ(ただし、後の数字がすべて0から7の範囲内の場合ね)。これが一番直感的な結果をもたらすと思う。

これ、全体の「悪い方が良い」ってエッセイと議論を思い出させるな。https://news.ycombinator.com/item?id=27916370 著者は「悪い」ソート、つまりASCII/Unicodeのコードポイントに基づいたソートを求めてるけど、99%のGUIユーザーが求める数字に対する知恵はないんだよね。彼らの目的のために、実装について何かを仮定していて、便利な機能が実は彼らにとっては逆効果になってる。けど、ここでの著者は多分開発者かその近くの人だから、コンピュータを使う大多数の人のニーズを代表してないんだ。製品のターゲットオーディエンスを理解することが、全然違うデザインの決定につながる。良い方が良いってのは製品にはいいかもしれないけど、悪い方が良いってのは成長して進化する必要があるシステムには多分いいんだろうね。

著者は「悪い」ソート、つまりASCII/Unicodeのコードポイントに基づいたものを望んでいるけど、99%のGUIユーザーが求めている知能はないんだよね。著者が大文字と小文字の文字をどうソートすべきかについての意見を聞きたいな。厳密にASCII/Unicodeのコードポイントに従うのか、それとも実際のアルファベット順に正規化して、各文字の中で大文字と小文字をソートするのか、どっちなんだろう?

これはメンタルモデルの問題だね。開発者として、彼のメンタルモデルは、混在した数字を含むアイテムをナイーブなソフトウェアがどうソートするかっていうものなんだ。ほとんどの人は、もちろん、自然に10を9の後に並べるから、彼らのメンタルモデルにはソフトウェア開発者の前提は含まれてないんだよ。

「あなたの製品のターゲットオーディエンスを理解することは、非常に異なるデザインの決定をもたらします」 これは言い訳だね。両方の方法でソートするオプションを追加すればいいだけだよ。難しくないし。地球上に、オプションや機能が少ないことで得をするターゲットオーディエンスなんていないよ。「アドバンスモード」のUIの下に機能があったとしても、最初からその機能がないよりはずっといいソフトウェアだよ。80/20ルールを忘れた人がいるのかな?ほとんどの機能は少数のユーザーにしか使われないけど、それがスコープ外ってわけじゃないからね。ごめん、ただ、ユーザーがどうあるべきかっていう完璧なビジョンに合わないからって、最も明白なことができないソフトウェアにはちょっと疲れちゃったんだ。

「foo9」が「foo10」の前に来るようにソートするのは自然ソートって呼ばれるよ。自然ソートについては一週間前に知ったんだけど、今はプログラムが理にかなった順序で出力してくれるから嬉しいよ。自然ソートを試してみて、あなたの生活も改善されるか見てみてね :-) ちなみに、自然ソートを実現するための魔法の2行のPythonコードはここにあるよ: https://stackoverflow.com/questions/11150239/natural-sorting...

自然ソートはsort(1)のオプションだよ: for i in $(seq 2 10) ; do touch img_$i-hn.txt done ls img_* | sort -V img_2-hn.txt img_3-hn.txt img_4-hn.txt img_5-hn.txt img_6-hn.txt img_7-hn.txt img_8-hn.txt img_9-hn.txt img_10-hn.txt それに、例えば「du -sh *」の出力を正しくソートするためのsort -hもあるよ。編集: フォーマットを整えて、sort -hを追加したよ。

ここでの本当の問題は、2つのAndroidフォンが互換性のない命名規則で写真を撮ることだと思う。誰かがミリ秒を秒から分けるべきかどうかを考えた時に、その変更を考えずにやっちゃったんじゃないかな。

いわゆる「自然な」ソートは、バージョン番号や列挙(ゼロパディングなし)には意味があるけど、私はもっとファイル名に日付時刻(記事にあるように)や16進数のハッシュ、あるいは数字を含むランダムな文字列を扱うことが多いんだ。そういう場合、「自然な」ソートだと探しているファイルを見つけるのが難しくなるよ。ファイルが列挙されているときでも、9パーツ以上でゼロパディングがないことはかなり珍しいし、「自然な」ソートが合わないユースケースではほとんど常に連続した数字があるからね。プログラマーの作業負荷にとっては、少なくとも悪いデフォルトに感じるよ。