最近、RHEL6がインストールされているシステムで次のものが見つかりました。
ls -lbi
917921 -rw-r-----. 1 alex pivotal 5245 Dec 17 20:36 application.yml
917922 -rw-r-----. 1 alex pivotal 2972 Dec 17 20:36 application11.yml
917939 -rw-r-----. 1 alex pivotal 3047 Dec 17 20:36 application11.yml
917932 -rw-r-----. 1 alex pivotal 2197 Dec 17 20:36 applicationall.yml
これをどのように実装するのか疑問に思います。
答え1
この動作を再現できます。例をご覧ください。
ls -lib
268947 -rw-r--r-- 1 root root 8 Dez 20 12:32 app
268944 -rw-r--r-- 1 root root 24 Dez 20 12:33 aрр
これは私のシステムにあります(Linux debian 4.9.0-7-amd64 #1 SMP Debian 4.9.110-3+deb9u2 (2018-08-13) x86_64 GNU/Linux
)。
UTF-8ロケールがあり、上記の出力の文字はp
異なりますが、似ているようです。最初の行はaLATIN SMALL LETTER P
で、2行目はaですCYRILLIC SMALL LETTER ER
(参照:https://unicode.org/cldr/utility/confusables.jsp?a=p&r=None)。これは単なる例であり、ファイル名の任意の文字、さらにはドットまで可能です。
UTF-8ロケールを使用すると、シェルは上記の出力を提供します。ただし、デフォルトのlocalなど、すべてのUnicode文字を含まないロケールを使用すると、c
出力は次のようになります(設定でロケールを変更できますLC_ALL
)。
LC_ALL=c ls -lib
268947 -rw-r--r-- 1 root root 8 Dec 20 12:32 app
268944 -rw-r--r-- 1 root root 24 Dec 20 12:33 a\321\200\321\200
CYRILLIC SMALL LETTER ER
これはASCIIには存在しないためです。
答え2
ちょうど同じ問題が発生しました。どちらのファイルも異なるinodeを持っていますが、名前は明らかに同じです(フランス語で)。 Chaosの優れた答えは、2番目のファイル名の2文字のéが最初のファイルの名前と異なるという事実を明らかにしました。次のファイルには同じ inode はありません。
私@ Ubuntu:~$ ls -li 2020\ 06\ 03\ CR\ R*
9586921 -rw-rw-r-- 1 francis francis 107933 jun 4 18:53 '2020 06 03 CR Réunion équipe.docx'
956 - 1 francis francis 107933 6月4日17:11 '2020 06 03 CR Reunion Island.docx'
そして彼らはまったく同じ名前を持っていません:
私@ Ubuntu:~$ LC_ALL=c ls 2020\ 06\ 03\ CR\ R*
bash: 警告: setlocale: LC_ALL: ロケールを変更できません。 (c)
'2020 06 03 CR Re'$'\314\201''union e'$' \314\201''quipe.docx' '2020 06 03 CR R'$'\303\251''ユナイテッド' $'\303\251''quipe.docx'
そしてその内容は同じです:
私@ Ubuntu:~$ cmp '2020 06 03 CRレビニオン島.docx' '2020 06 03 CRレビニオン島.docx'
説明によると、2番目のファイル名では、éはUTF8 LATIN SMALL LETTER E AND ACUTE(C3 A9)、最初のLATIN SMALL LETTER E + COMBINING ACUTE ACCENT(65 CC 81)です。
LATIN SMALL LETTER E + COMBINING ACUTE ACCENTをWebフォームに貼り付けると、LATIN SMALL LETTER E AND ACUTEに変換されます。