鱼壳中的全局匹配(通配符)与bash行为不匹配

时间:2015-03-03 17:58:38

标签: bash glob fish

当我在bash中使用以下命令时,我得到一个与我想要的正则表达式匹配的文件列表:

$> ls *-[0-9].jtl
benchmark-1422478133-1.jtl  benchmark-1422502883-4.jtl  benchmark-1422915207-2.jtl

但是,当我在fish shell中运行相同的命令时,我会得到不同的结果:

$> ls *-[0-9].jtl
fish: No matches for wildcard '*-[0-9].jtl'.
ls *-[0-9].jtl
   ^

怎么回事?

3 个答案:

答案 0 :(得分:6)

Fish的文档并未声称支持POSIX glob模式的全部功能。

引用文档:

  

通配符

     

如果参数中存在星号(*)或问号(?),则fish会尝试将给定参数与任何文件匹配,其方式为:

     
      
  • ?可以匹配除/以外的任何单个字符。
  •   
  • *可以匹配任何不包含/的字符串。这包括匹配空字符串。
  •   
  • **匹配任何字符串。这包括匹配空字符串。该字符串可能包含/字符,但不需要。
  •   

值得注意的是,没有提到角色类,因为鱼不支持它们。

如果您希望globs保证支持所有POSIX(fnmatch)功能,请使用POSIX兼容或POSIX-superset shell。

答案 1 :(得分:0)

您还可以使用更多扩展的工具Unix find。它非常强大。

示例:使用正则表达式

find . -path '.*-[0-9].jtl' -not -path '.*-32.jtl'

答案 2 :(得分:0)

这是一篇较旧的帖子,但我认为值得重温一下。在撰写本文时(2021 年 3 月),文档确实明确声明支持通配符。

<块引用>

Fish 支持熟悉的通配符 *。列出所有 JPEG 文件:

> ls *.jpg
lena.jpg
meena.jpg
santa maria.jpg

您可以包含多个通配符:

> ls l*.p*
lena.png
lesson.pdf

特别强大的是递归通配符**,它递归地搜索目录:

> ls /var/**.log
/var/log/system.log
/var/run/sntp.log

但是,我仍然经常遇到同样的问题

[/home/glass ]
><glass@rockpiX-Ubuntu> rm *.log.old
fish: No matches for wildcard “*.log.old”. See `help expand`.
rm *.log.old
   ^