【问题标题】:Glob matching (wildcards) in fish shell not matching bash behavior鱼壳中的全局匹配(通配符)与 bash 行为不匹配
【发布时间】:2015-03-03 17:58:37
【问题描述】:

当我在 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
   ^

怎么会?

【问题讨论】:

  • 不知道答案,但在 bash 中,这不是正则表达式,而是通配符。它看起来很相似,但有很大的不同。

标签: bash glob fish


【解决方案1】:

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

引用文档:

通配符

如果参数中出现星号 (*) 或问号 (?),fish 会尝试将给定参数与任何文件匹配,这样:

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

值得注意的是,没有提到字符类,因为 fish 不支持它们。

如果您希望 glob 保证支持所有 POSIX (fnmatch) 功能,请使用符合 POSIX 或 POSIX 超集的 shell。

【讨论】:

  • 还有一个关于远程通配符的小提示。 Bash 将允许 'scp remote-host:* mydir' 但fish 会尝试扩展它并失败。解决方案是引用远程路径。
  • 那么,也许ls | grep '.*-[0-9]\.jlt'是鱼壳上的推荐方式?
【解决方案2】:

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

示例:使用正则表达式

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

【讨论】:

    【解决方案3】:

    这是一篇较旧的帖子,但我认为值得重温。在撰写本文时(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
       ^
    

    【讨论】:

      猜你喜欢
      • 2012-03-26
      • 2011-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-03
      • 2013-09-03
      • 1970-01-01
      相关资源
      最近更新 更多