ls -l | grep列表文件

时间:2012-06-14 21:25:49

标签: macos grep ls

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

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

2 个答案:

答案 0 :(得分:5)

像“é”这样的字符可以用两种不同的方式用Unicode表示。它可以是一个单独的,预先组合的Unicode字符,带有ACUTE U + 00E9的LATIN SMALL LETTER E,或者它可以分解为两个字符,LATIN SMALL LETTER E U + 0065,然后是COMBINING ACUTE ACCENT U + 0301。

在Mac OS X上,文件系统API始终规范化为规范化表格D(NFD)的特殊变体。在适当的NFD中,所有可以分解的字符都是。在Mac OS X文件系统API使用的NFD变体中,某些字符是预先组合的,以便与旧版卷向后兼容。

无论如何,我怀疑在终端中输入的字符的表单与ls输出的表单不同。我会比较ls -l | hexdump -Cecho -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")*

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

答案 1 :(得分:1)

我找到了一个有效的解决方案:

ls -l | iconv -f UTF-8-MAC -t UTF-8 | grep é