为什么此 find 命令不返回仅包含非 ASCII 字符的文件名?

为什么此 find 命令不返回仅包含非 ASCII 字符的文件名?

find我试图确定该命令不起作用的根本原因;它不应该与下面调用的文件匹配this_should_not_match

$ > find . -type f -name "*[^ -~]*"
./__º╚t
./this_should_not_match
./__╞_u
./__¡VW
./__▀√Z
./__εè_
./__∙Σ_
./__Σ_9
./__Σhm
./__φY_

我的 shell 是 Bash 3.2

答案1

范围仅在 C 语言环境中可靠且可移植地工作。在其他语言环境中,您会得到一些变化,但通常会得到按某种排序顺序在前后[x-y]排序的字符(实际上是整理元素,它甚至可以匹配字符序列),这通常是模糊的,并且并不总是与使用的相同。xysort

在 C 语言环境中(请参阅“LC_ALL=C”有什么作用?),字符是字节,范围基于字符的代码点(基于字节值)。

LC_ALL=C find . -type f -name "*[^ -~]*"

在基于 ASCII 的系统上(其中大多数;POSIX 不保证 C 语言环境使用 ASCII 字符集,但实际上,除非您使用的是某些基于 EBCDIC 的特殊 IBM 大型机操作系统(但随后您就会知道) ,您将使用 ASCII)将列出名称中包含 32 到 126 之间字节以外的字节的常规文件。

另请注意,在多字节字符区域设置(例如 UTF-8 区域设置,当今的标准)中,*甚至可能无法匹配所有文件名,就像在某些系统上一样,它将无法匹配不形成有效字符的字节序列。

相关内容