我最近在一台装有 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 ER
ASCII 中不存在 。
答案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。