macos - ls -l | grep 列出文件

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

最佳答案

像“é”这样的字符可以用两种不同的方式在 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 -Cecho -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/

相关文章:

linux - 查找固定长度的文件

bash - 奇怪的 bash 行为

windows - 当 PC 程序员更新 Mac 程序员最近提交的文件时,SVN diff 将所有代码行标记为新代码

macos - 永久允许 Xamarin iOS 应用接受传入连接(Xamarin 测试云代理)

linux - 在某个时间段之间进行 Grep

linux - 如何缩短此 grep 命令?

ios - Mac : Screen shot selection implementation?(能够选择屏幕的一部分)

适用于 Mac 的 Oracle 图形用户界面

目录名称中的 bash 空格使用 find 导致 ls 中的换行符

docker - 为什么当ls报告确实存在时,Docker为什么报告入口点文件不存在?