3

我想列出带有é我执行此命令的字符的文件:

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 上运行命令。有什么问题吗?

4

2 回答 2

5

像“é”这样的字符可以用两种不同的方式在 Unicode 中表示。它可以是单个预先组合的 Unicode 字符,拉丁小写字母 E WITH ACUTE U+00E9,也可以分解为两个字符,拉丁小写字母 E U+0065 后跟组合重音 U+0301。

在 Mac OS X 上,文件系统 API 总是规范化为规范化表单 D (NFD) 的特殊变体。在适当的 NFD 中,所有可以分解的字符都是。在 Mac OS X 文件系统 API 使用的 NFD 变体中,为了向后兼容旧卷,保留了一些字符。

无论如何,我怀疑在终端中输入的字符形式与输出的形式不同lsls -l | hexdump -C我会比较和之间的区别echo -n é | hexdump -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")*

基本上,我printf在子shell 中使用作为输入文件名中使用的精确字节序列的一种方式。以正常方式键入字符会产生不匹配的不同字节序列。

于 2012-06-14T22:06:07.237 回答
1

我找到了一个可行的解决方案:

ls -l | iconv -f UTF-8-MAC -t UTF-8 | grep é
于 2012-06-15T06:31:53.890 回答