我最近在一台装有 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
我想知道如何实现这样的目标?
我能够重现这种行为。参见例如:
这是在我的系统上 (
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
,第二行是 aCYRILLIC SMALL LETTER ER
(参见https://unicode.org/cldr/utility/confusables.jsp?a=p&r=None)。这只是一个示例,它可以是文件名中的每个字符,甚至是点。当我使用 UTF-8 语言环境时,我的 shell 会给出上述输出。但是,如果我使用的语言环境不是所有的 unicode 字符,例如默认语言环境
c
,那么输出如下所示(您可以通过设置更改本地环境LC_ALL
):这是因为
CYRILLIC SMALL LETTER ER
ASCII 中不存在 。我只是有同样的问题。两个具有不同 inode,但显然名称相同的文件(法语)。Chaos 的出色回答让我走上了正轨:第二个文件名称中的两个字符 é 与第一个文件的名称不同。这些文件没有相同的inode:
并且它们的名称不完全相同:
并且它们的内容是相同的:
解释是,在第二个文件的名称中,é 是 UTF8 LATIN SMALL LETTER E WITH ACUTE (C3 A9),在第一个 LATIN SMALL LETTER E + COMBINING ACUTE ACCENT (65 CC 81) 中:
注意,通过在网页表格中粘贴拉丁小写字母 E + COMBINING ACUTE ACCENT,可以将其转换为拉丁小写字母 E WITH ACUTE。