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

mtk*_*mtk 74 ls shell wildcards case-sensitivity

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

例如,我运行以下命令:

ls *abc*
Run Code Online (Sandbox Code Playgroud)

我想查看所有将“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
Run Code Online (Sandbox Code Playgroud)

笔记

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

pol*_*mon 73

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

在 中bash,您将使用:

shopt -s nocaseglob
Run Code Online (Sandbox Code Playgroud)

然后运行命令。

或在zsh

unsetopt CASE_GLOB
Run Code Online (Sandbox Code Playgroud)

或者在 yash 中:

set +o case-glob
Run Code Online (Sandbox Code Playgroud)

然后是你的命令。

您可能希望将其分别放入.bashrc.zshrc.yashrc

或者,使用 zsh:

setopt extendedglob
ls -d -- (#i)*abc*
Run Code Online (Sandbox Code Playgroud)

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

使用 ksh93:

ls -d -- ~(i:*abc*)
Run Code Online (Sandbox Code Playgroud)

您希望通配符以不同的方式工作,而不是ls,因为这些都是lsshell传递给的文件。

  • @mtk:要*设置*一个选项,您可以使用`shopt -s`;要*取消设置*它,您可以使用`shopt -u`。或者,您可以使用`( )` 将所有内容包装在子shell 中,这样设置就不会影响父shell:`(shopt -s nocaseglob ; ls *abc*)`。 (11认同)

jfg*_*956 26

正如polemon 解释的那样,扩展*abc*到文件列表的是shell(而不是ls)。这称为模式匹配

除了将整个模式匹配行为更改为忽略大小写外,您还可以使用另一种形式的模式匹配而不是*. 以下将在 bash 中执行您想要的操作:

ls *[aA][bB][cC]*
Run Code Online (Sandbox Code Playgroud)

来自 bash 人:

[...] 匹配任何一个封闭的字符。

这允许更细粒度的匹配,您可以使用*[aA][bB]c*匹配abcorABc但不匹配abCor ABC。或者一个法语示例,我可以在其中匹配e字符的所有实例:

ls *[eéèêëEÉÈÊË]*
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,随着模式变长,这种方法很快变得笨拙。但对于简短的事情,它有效。 (3认同)
  • 这是正确的答案。改变 shell 行为则不然。 (2认同)

ARe*_*ddy 13

您还可以添加-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
Run Code Online (Sandbox Code Playgroud)


mat*_*mat 6

我认为 ls 不可能做到这一点,但您可以改用 find:

find . -maxdepth 1 -iname '*abc*'
Run Code Online (Sandbox Code Playgroud)