我需要找到以三个小写字母开头的文件,但是由于某种原因,我遇到了不希望的不区分大小写的行为。 我正在使用带有-regex选项的find,但是它甚至可以找到以大写字母开头的文件。
$ find . -regextype posix-egrep -regex '.*/[a-z]{3}\w+\.abc'
./TTTxxx.abc
./tttyyy.abc
打印与以下内容相同:
$ find . -regextype posix-egrep -regex '.*/[A-Z]{3}\w+\.abc'
./TTTxxx.abc
./tttyyy.abc
如果我不使用一个字符范围,而是使用一个字符,则可以敏感,只打印小写文件。
find . -regextype posix-egrep -regex '.*/[t]{3}\w+\.abc'
./tttyyy.abc
我尝试使用不同的正则表达式,结果是相同的。
此外,一个egrep似乎可以正常工作:
find . -regextype posix-egrep -regex '.*/.+\.abc' | egrep '/[a-z]\w+\.abc'
./tttyyy.abc
为什么使用char范围时“ find -regex”不区分大小写?
注意:,我需要使用find命令,因为我需要使用-exec选项。
非常感谢。
答案 0 :(得分:0)
根据Why does [A-Z] match lowercase letters in bash?,排序规则是这里的问题:
带有语言环境(例如en_US)的标准排序规则具有以下顺序:
aAbBcC...xXyYzZ
a
和z
之间(在[a-z]
中)都是大写字母,但Z
除外。 在A
和Z
之间(在[A-Z]
中),除了a
以外的所有小写字母。
因此,您需要显式列出所有小写字母或更改排序规则:
$ export LC_COLLATE=C
并使用标准的[a-z]
。
[...]{3}\w\.abc
-这种模式,其中[...]
是[a-z]
或列出的小写字母,将为您提供文件名。