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


57

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

例如,我运行以下命令:

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

注意

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

Answers:


65

实际上,这是由您的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*)

您希望glob的工作方式不同,而不是ls,因为这些都是lsshell 传递给所有文件的。


在bash中,如果使用,如何重置为原始设置shport -s nocaseglob
mtk 2012年

6
@mtk:要设置选项,请使用shopt -s;要取消设置,请使用shopt -u。另外,您可以使用将所有内容包装在子shell中,以( )使该设置不会影响父shell :(shopt -s nocaseglob ; ls *abc*)
ruakh 2012年

因此,在POSIX或SUS或类似的东西中(除了[aA][bB][cC]),没有任何可移植的方法吗?
Timothy Gu

出色的解决方案,我不敢相信shopt在使用bash的过去15年中,我从未遇到过命令!
Reza Sanaie 2015年

Jfg956的答案是正确的(下一个)。当您有一个正则表达式时,为什么要更改外壳程序行为?
EnzoR

20

正如polemon所解释的,扩展*abc*到文件列表的是外壳程序(不是ls)。这称为模式匹配

除了更改整个模式匹配行为以忽略大小写之外,您还可以使用以外的其他形式的模式匹配*。以下将在bash中完成您想要的操作:

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

来自bash man:

[...]匹配其中任一字符。

这使得更多的细粒度匹配,你可以使用*[aA][bB]c*匹配abc或者ABc,但没有abCABC。或一个法语示例,我想匹配该e字符的所有实例:

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

1
不幸的是,随着模式变得更长,该方法很快变得笨拙。但是对于简短的事情,它是可行的。
derobert 2012年

@derobert:完全正确,尤其是(很可能是这种情况),shell通过在比较之前将所有文件名和匹配请求放到小写形式来优化了忽略匹配的大小写。但是,[...]在很多情况下它可能是有用的,尽管值得一提。
jfg956

1
这是正确的答案。不能更改外壳行为。
EnzoR

如果正确设置了语言环境,则应该能够使用等价类[[=e=][=E=]]
本杰明·

8

您还可以添加-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

与grep相比,模式匹配具有更好的性能,因为grep需要收集所有内容然后进行过滤。使用较大的文件夹时,有明显的不同。
Omi '18年

@Omi此外,正则表达式用于文本,尤其是文本。文件名可能包含换行符。
库沙兰丹

3

我认为ls不可能实现,但是您可以使用find代替:

find . -maxdepth 1 -iname '*abc*'


0

您可以使用-i添加不敏感选项的文件进行GREP 。

例如找到两者abcABC您可以运行此命令

    [root@mtk bin]# ls -l | grep -i abc
    640K -rw-r--r-- 1 mtk mtk 639K Sep 21 08:12 file1abc.txt
    676K -rw-r--r-- 1 mtk mtk 674K Sep 21 08:12 file2ABC.txt

5
路易斯·佩雷斯(Luis Perez)我想您-i在命令中的任何地方都没有使用过option。
Mongrel,2016年


-2

在tcsh中,在.aliases中设置一个别名

alias lsnc "ls BS!* | sort -f "

(“ BS” =一个“反斜杠”;我必须使用它来使它显示在我的浏览器中。)

并使用lsnc代替ls

在bash中,尝试在.bash_aliases中使用别名,例如

lsnc() { ls $1 | sort -f ; }

使用的选项ls,例如,ls -l这是一个简单的解决方法:

tcsh:

alias lsncl "ls -l BS!* | sort -f -k 9"

重击:

lsncl() { ls -l $1 | sort -f -k 9 ; }

您确定=在lsnocase之后不会缺少' '吗?
Anthon

Anthon:在Cygwin和Ubuntu上,(修订)的lsnc和lsncl在tcsh和bash下为我工作。请注意,对于bash而言,我使用的是函数本身,而不是“别名”。Lester
Lester Ingber

Anthon:是的,您可能可以在bash中使用别名,例如别名lsncl ='ls -l $ 1 |。排序-f -k 9'
莱斯特Ingber

这个答案没有解决特定的问题,该问题想要将传递给ls的文件传递为不区分大小写。如果外壳通过传递过少的文件ls,没有什么lssort能不能修复的情况。如其他答案中所述,该问题需要在shell中解决,而不是使用ls语法。
Mark Stosberg
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.