在文件搜索中使用*


9

在阅读有关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(empty)在内的字符串的任意组合,那么为什么两种情况下的结果都不相同...?

Answers:


11

完成后ls **将其扩展到之前将其扩展ls。也就是说,如果我们有三个文件(abc)目录中的ls *实际运行ls a b c

当Bash无法扩展时,它将通过原始字符串¹。因此,您会在错误中看到通配符以及未找到的消息。ls试图显示一个名为的文件的清单*.bash*

为什么不扩大呢?好吧,默认情况下,通配符(称为通配符扩展)不会返回隐藏文件。您可以使用进行更改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的是如何改变作品的通配符标志:extglobfailglobglobstarnocaseglobnullglob。它们和大量其他shopt标志作为Bash手册的一部分进行记录。

同样,有关模式匹配的页面也应该有所帮助。

¹除非failglobnullglob设置。


thanx @Oli ,,当我提到我对这种口味不熟悉时,我并没有得到所有这些,但是我得到了其中的80%...它帮助了我
lazarus 2014年
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.