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]
排序的字符(实际上是整理元素,它甚至可以匹配字符序列),这通常是模糊的,并且并不总是与使用的相同。x
y
sort
在 C 语言环境中(请参阅“LC_ALL=C”有什么作用?),字符是字节,范围基于字符的代码点(基于字节值)。
LC_ALL=C find . -type f -name "*[^ -~]*"
在基于 ASCII 的系统上(其中大多数;POSIX 不保证 C 语言环境使用 ASCII 字符集,但实际上,除非您使用的是某些基于 EBCDIC 的特殊 IBM 大型机操作系统(但随后您就会知道) ,您将使用 ASCII)将列出名称中包含 32 到 126 之间字节以外的字节的常规文件。
另请注意,在多字节字符区域设置(例如 UTF-8 区域设置,当今的标准)中,*
甚至可能无法匹配所有文件名,就像在某些系统上一样,它将无法匹配不形成有效字符的字节序列。