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

Zai*_*aid 3 bash character-encoding find unicode files

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

$ > find . -type f -name "*[^ -~]*"
./__º?t
./this_should_not_match
./__?_u
./__¡VW
./__??Z
./__?è_
./__??_
./__?_9
./__?hm
./__?Y_
Run Code Online (Sandbox Code Playgroud)

我的外壳是 Bash 3.2

Sté*_*las 5

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

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

LC_ALL=C find . -type f -name "*[^ -~]*"
Run Code Online (Sandbox Code Playgroud)

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

另请注意,在多字节字符区域设置(如 UTF-8 区域设置,现在的规范)中,*甚至可能不匹配某些系统上的所有文件名,它将无法匹配不构成有效字符的字节序列.