如何将不区分大小写的模式与 ls 匹配?

如何将不区分大小写的模式与 ls 匹配?

我想列出与特定模式匹配的所有文件,同时忽略大小写。

例如,我运行以下命令:

ls *abc*

我想查看文件名中包含“abc”的所有文件,忽略大小写,例如

-rw-r--r-- 1 mtk mtk 0 Sep 21 08:12 file1abc.txt
-rw-r--r-- 1 mtk mtk 0 Sep 21 08:12 file2ABC.txt

笔记

我在手册页中搜索了案例,但找不到任何内容。

答案1

这实际上是由您的 shell 完成的,而不是由ls.

在 中bash,您可以使用:

shopt -s nocaseglob

然后运行你的命令。

或者在zsh

unsetopt CASE_GLOB

或者在 yash 中:

set +o case-glob

然后是你的命令。

您可能想分别将其放入.bashrc.zshrc.yashrc中。

或者,使用 zsh:

setopt extendedglob
ls -d -- (#i)*abc*

(即在每个通配符的基础上不区分大小写的通配符)

使用 ksh93:

ls -d -- ~(i:*abc*)

你要通配工作方式不同,而不是ls,因为这些都是lsshell 传递给的文件。

答案2

正如polemon 所解释的,它是 shell(而不是 ls)扩展*abc*到文件列表。这就是所谓的模式匹配

除了更改整个模式匹配行为以忽略大小写之外,您还可以使用除*.以下内容将在 bash 中执行您想要的操作:

ls *[aA][bB][cC]*

来自 bash 人:

[...] 匹配任何一个包含的字符。

这允许更细粒度的匹配,您可以使用或*[aA][bB]c*来匹配,但不能使用或。或者一个法语示例,我可能想要匹配该字符的所有实例:abcABcabCABCe

ls *[eéèêëEÉÈÊË]*

答案3

您还可以添加-i(--ignore-case) 选项来grep获取以下输出。

[root@localhost ~]# ls -l | grep -i abc
-rw-r--r--  1 root root    0 Feb 25 20:41 fileabc.txt
-rw-r--r--  1 root root    0 Feb 25 20:41 fileABC.txt

答案4

使用以下代码:

LC_COLLATE=en_US ; export LC_COLLATE
ls *abc*
LC_COLLATE=C ; export LC_COLLATE

相关内容