相同的文件名不同的 INODES

dej*_*dej 11 filenames inode files

我最近在一台装有 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
Run Code Online (Sandbox Code Playgroud)

我想知道如何实现这样的目标?

cha*_*aos 11

我能够重现这种行为。见例如:

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??
Run Code Online (Sandbox Code Playgroud)

这是在我的系统上 ( 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
Run Code Online (Sandbox Code Playgroud)

这是因为CYRILLIC SMALL LETTER ERASCII 中不存在。

  • 知道在 Unix _except_ for MacOS 的所有实现中,文件名被内核视为不透明的 _bytes_ 序列,而不是字符,这可能会有所帮助。您可以在目录条目中放置任何您想要的字节序列,只要没有一个字节具有值 0x2F(路径组件分隔符,ASCII '/')或 0x00(C 字符串终止符,ASCII NUL)。将字节序列解释为某些字符编码完全是用户空间的问题。 (3认同)
  • @JörgWMittag 用户从来没有说过他们的语言环境,所以“多次检查”从来没有包括将语言环境设置为 C 语言环境,因此每次都在他们的 UTF-8 语言环境中获得相同的输出是合理的。 (2认同)