我想列出带有字符 é
的文件 我执行这个命令:
ls -l | grep é
没有结果。目录内容:
-rw-r--r-- 1 user staff 5020 3 may 11:48 begin
-rw-r--r-- 1 user staff 0 13 jun 08:47 canté
-rw-r--r-- 1 user staff 0 13 jun 08:47 centré
-rw-r--r-- 1 user staff 5020 3 may 11:48 end
语言环境配置
LANG="es_ES.UTF-8"
LC_COLLATE="es_ES.UTF-8"
LC_CTYPE="es_ES.UTF-8"
LC_MESSAGES="es_ES.UTF-8"
LC_MONETARY="es_ES.UTF-8"
LC_NUMERIC="es_ES.UTF-8"
LC_TIME="es_ES.UTF-8"
LC_ALL=
在 Mac Os X 10.7.3 上运行命令。有什么问题吗?
最佳答案
像“é”这样的字符可以用两种不同的方式在 Unicode 中表示。它可以是单个预组合的 Unicode 字符,带尖音符 U+00E9 的拉丁文小写字母 E,也可以分解为两个字符,小写拉丁文字母 E U+0065,后跟组合尖音符 U+0301。
在 Mac OS X 上,文件系统 API 总是规范化为规范化形式 D (NFD) 的特殊变体。在适当的 NFD 中,所有可以分解的字符都是。在 Mac OS X 文件系统 API 使用的 NFD 变体中,为了与旧卷向后兼容,保留了一些字符。
无论如何,我怀疑在终端中输入的字符形式与 ls
输出的形式不同。我会比较 ls -l | 之间的区别hexdump -C
和 echo -né |十六进制转储-C
。 (在这两种情况下,您都会得到 UTF-8。因此,U+00e9 将显示为 c3 a9,而 U+0065 U+0301 将显示为 65 cc 81。)
更新:通过一些测试,我发现这可行:
ls -l | grep $(printf "e\xcc\x81")
这类似于 sarnold 的建议,也有效:
ls -l *$(printf "e\xcc\x81")*
基本上,我在子 shell 中使用 printf
作为输入文件名中使用的精确字节序列的方法。以正常方式键入字符会产生不匹配的不同字节序列。
关于macos - ls -l | grep 列出文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11041580/