正規化されていないUTF-8ディレクトリ名

正規化されていないUTF-8ディレクトリ名

私のディレクトリの1つで興味深い点を見つけました。

$ ls -li
total 36
2625309 drwxrwxr-x 2 dotancohen dotancohen 4096 Jul  4  2022  Español
2625385 drwxrwxr-x 2 dotancohen dotancohen 4096 Jul  4  2022  Español
2625396 drwxrwxr-x 2 dotancohen dotancohen 4096 Jul  4  2022  Français
2625406 drwxrwxr-x 2 dotancohen dotancohen 4096 Jul  4  2022  Français

$ ls Espa<tab><tab>
Español/ Español/

$ echo Espa* | od -tx1 -c
0000000  45  73  70  61  6e  cc  83  6f  6c  20  45  73  70  61  c3  b1
          E   s   p   a   n 314 203   o   l       E   s   p   a 303 261
0000020  6f  6c  0a
          o   l  \n
0000023

これらは別のディレクトリです。 inode番号が異なります(最初の列、これが対応する-iフラグが使用される理由です)。 2つのスペイン語ディレクトリには異なる名前があり、そのうちの1つの名前は次のとおりです。数値: E s p a o l。相手の名前は次のとおりです。数値: E s p a n COMBINING TILDE o l。視覚的に、2つのファイル名は区別できず、すべてのソフトウェアで2つのいずれかを作成できます。これCOMBINING TILDEn前の文字と同じ「スペース」に印刷されます。

これは実際に数年前にAndroidデバイス(Samsung Note 3)で作成し、ADBを介してLinuxデスクトップにコピーしたメモで、最近まで残りました。これは質問の世界を開きます。

  1. キャラクター組合規制は誰が担当しますか?私はこの責任をファイルを書くプログラム(または驚くべきことにエンドユーザー)に委任することが問題をさらに悪化させるだけだと思います。ファイルシステムの標準化をお勧めしますか?

  2. ファイルシステムの正規化問題を処理するためのツールはありますか?異なる正規化された形式で同じ名前のディレクトリを探し、これらのディレクトリを重複排除してマージするなどの作業は可能ですか? mtimesのように更新せずに、ファイルシステム全体を標準の完全修飾形式でインポートすることもできます。

  3. これらの問題により、どのプログラムがクラッシュする可能性がありますか?問題はないncduようですが、find他のソフトウェアが異なる正規化で同じ名前のディレクトリをうまく処理しないかどうかを知りたいです。たとえば、ソフトウェアの標準化されたファイル名は開いたファイル名とは異なる方法で記録されるため、ユーザーが別のディレクトリに書き込もうとすると、あるディレクトリの内容が上書きされます。

  4. 私が期待していないことがまたあるのだろうか?

関連情報