如何使 bash 的 glob 字符类区分大小写?

Mut*_*Bob 5 bash globbing

我创建了一些文件,比如knob_A.pngknob_a.png,我在 Windows 上的队友说这会导致她的应用程序出现问题。我决定调用它knob_W.png而不是knob_a.png. 然后我对我们的共享服务器做了一个 rsync。为了清理东西,我然后做了

rm knob_[a-d]*.png
Run Code Online (Sandbox Code Playgroud)

它也删除knob_A.png了。这是错误的足球棒。

shopt -s nocaseglob不会也不会shopt -u nocaseglob导致它按照我想要的方式行事。

我如何告诉 bash 让它的 glob 像过去一样区分大小写?

xor*_*ar0 8

Bash 在这里区分大小写。问题在于范围内字符的排序顺序。来自 Bash 手册 ( info bash):

范围表达式中字符的排序顺序由当前语言环境和“LC_COLLATE”shell 变量(如果已设置)的值确定。

例如,在默认的 C 语言环境中,'[a-dx-z]' 等价于 '[abcdxyz]'。许多语言环境按字典顺序对字符进行排序,在这些语言环境中,'[a-dx-z]' 通常不等同于 '[abcdxyz]';例如,它可能等效于“[aBbCcDdxXyYz]”。要获得括号表达式中范围的传统解释,您可以通过将 'LC_COLLATE' 或 'LC_ALL' 环境变量设置为值 'C' 来强制使用 C 语言环境。

尝试做

export LC_COLLATE=C
Run Code Online (Sandbox Code Playgroud)