在文件搜索中使用*

在阅读关于linux文件搜索时,我得到了以下内容……

要使用*通配符搜索文件,请将未知字符串替换为*,例如,如果您只记得扩展名为.out,请键入ls * .out

当我在系统上尝试以下命令(ubuntu 14.04 LTS)时..我得到了

anupam@JAZZ:~$ ls *.bash* ls: cannot access *.bash* : No such file or directory anupam@JAZZ:~$ ls .bash* .bash_history .bash_logout .bash_profile .bashrc anupam@JAZZ:~$ 

在第一种情况下,为什么它显示没有这样的目录( *.bash* ),在下一种情况下,它显示文件( .bash*

我是新手,根据我的自动机理论类(*)表示包括epsilon(空)的任何字符串组合,那么为什么结果在两种情况下都不同….?

当你执行ls * *会在传递给ls 之前进行扩展。 也就是说,如果我们在目录中有三个文件( abc ),则ls *实际上运行ls abc

当Bash无法扩展时,它会通过原始字符串¹。 这就是为什么你会看到错误中的通配符以及未找到的消息。 ls试图显示一个名为*.bash*的文件列表。

为什么不扩大呢? 默认情况下,globbing(调用此通配符扩展)将不会返回隐藏文件。 你可以用shopt -s dotglob改变这个(除非你把它粘在你的.bashrc否则它不会持续存在 – 默认情况下可能会被禁用,因此要小心),这里有一个快速演示:

 $ ls *.bash* ls: cannot access *.bash*: No such file or directory $ shopt -s dotglob $ ls *.bash* .bash_aliases .bash_history .bash_logout .bashrc .bashrc.save 

例外情况是 – 您已经显示 – 当您已经明确声明文件将以.bash*等模式隐藏时。 它只是覆盖了默认的dotglob设置:

 $ shopt -u dotglob # unset dotglob $ ls .bash* .bash_aliases .bash_history .bash_logout .bashrc .bashrc.save 

无论如何除了这个怪癖,我希望这可以帮助你理解表面下发生的事情。


还有其他的shopt标志可以改变globbing的工作方式: extglobfailglobglobstarnocaseglobnullglob 。 他们和一大堆其他shopt标志被记录为Bash手册的一部分。

同样, 模式匹配页面应该有一些好的阅读。

¹除非设置了failglobnullglob