相同的文件名不同的 INODES

相同的文件名不同的 INODES

我最近在一台装有 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不一样,但看起来很相似。第一行是 a LATIN SMALL LETTER P,第二行是 a CYRILLIC SMALL LETTER ER(参见https://unicode.org/cldr/utility/confusables.jsp?a=p&r=None)。这只是一个示例,它可以是文件名中的每个字符,甚至是点。

当我使用 UTF-8 语言环境时,我的 shell 会给出上述输出。但是,如果我使用的语言环境不包含所有 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 ERASCII 中不存在 。

答案2

我刚刚遇到了同样的问题。两个文件具有不同的索引节点,但显然名称相同(法语)。Chaos 的出色回答让我明白了:第二个文件名称中的两个字符 é 与第一个文件的不同。这些文件没有相同的索引节点:

我@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'
9569690 -rw-rw-r- - 1 francis francis 107933 六月 4 17:11 '2020 06 03 CR 留尼汪岛.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'

解释是,第二个文件的名称中,é是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,即可转换为LATIN SMALL LETTER E AND ACUTE。

相关内容