![如何将不区分大小写的模式与 ls 匹配?](https://linux22.com/image/25802/%E5%A6%82%E4%BD%95%E5%B0%86%E4%B8%8D%E5%8C%BA%E5%88%86%E5%A4%A7%E5%B0%8F%E5%86%99%E7%9A%84%E6%A8%A1%E5%BC%8F%E4%B8%8E%20ls%20%E5%8C%B9%E9%85%8D%EF%BC%9F.png)
我想列出与特定模式匹配的所有文件,同时忽略大小写。
例如,我运行以下命令:
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
,因为这些都是ls
shell 传递给的文件。
答案2
正如polemon 所解释的,它是 shell(而不是 ls)扩展*abc*
到文件列表。这就是所谓的模式匹配。
除了更改整个模式匹配行为以忽略大小写之外,您还可以使用除*
.以下内容将在 bash 中执行您想要的操作:
ls *[aA][bB][cC]*
来自 bash 人:
[...] 匹配任何一个包含的字符。
这允许更细粒度的匹配,您可以使用或*[aA][bB]c*
来匹配,但不能使用或。或者一个法语示例,我可能想要匹配该字符的所有实例:abc
ABc
abC
ABC
e
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