ls -l | grep列表文件

use*_*291 3 macos grep ls

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

ls -l | grep é
Run Code Online (Sandbox Code Playgroud)

没有结果.目录内容:

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

语言环境配置

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

在Mac Os X 10.7.3上运行命令.有什么不对吗?

Ken*_*ses 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")
Run Code Online (Sandbox Code Playgroud)

这与sarnold的建议类似,也有效:

ls -l *$(printf "e\xcc\x81")*
Run Code Online (Sandbox Code Playgroud)

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