【问题标题】:Search a directory for files with fixed name pattern在目录中搜索具有固定名称模式的文件
【发布时间】:2017-11-09 21:28:14
【问题描述】:

我想在一个目录(我们称之为“testDir”)中搜索名称以字母“a”开头、第四位有字母“z”且文件扩展名为 .html 的文件。

有没有办法为此使用grep?如何在固定索引处搜索字符?

【问题讨论】:

  • 我想将输出打印到终端,所以(在阅读了 grep 手册之后)我尝试了:“ ls testDir | grep -e 'a' -e 'html'” 但我仍然不知道在文件名中查找模式时如何指定字符的索引
  • @janos 感谢您没有立即给我解决方案。最终这个:“ ls test | grep -e "^a..z" | grep html " 工作得很好:)。你能解释一下“^”在 grep 字符串搜索中的作用吗?
  • 在我的回答中添加了^ 的解释。如果您对此还有其他问题,请在答案本身上发表您的评论,否则我可能不会注意到!

标签: bash shell unix grep ls


【解决方案1】:

您可以使用本机 Bash 模式匹配:a??z*.html。这种模式正是您所要求的:

  • 以字母“a”开头
  • 后跟任意两个字符
  • 后跟字母“z”(第 4 位)
  • 后跟 0 个或多个字符
  • 以“.html”结尾

您可以使用任何在作为参数传递时打印文件名的 shell 工具获取匹配的文件名。 一些例子:

  • ls testDir/a??z*.htmlecho testDir/a??z*.html。请注意,这些将使用 testDir/ 前缀打印。
  • (cd testDir && echo a??z*.html) 将只打印不带 testDir/ 前缀的文件名。
  • 请注意,当没有匹配的文件时,ls 命令会产生错误,而echo 命令会打印模式 (a??z*.html)。

有关模式匹配的更多详细信息,请参阅man bash 中的模式匹配部分。

如果您正在寻找在没有匹配项时不产生输出的替代方案,grep 将更易于使用,但grep 使用不同的语法来匹配模式,它使用正则表达式。 用正则表达式编写的相同模式是^a..z.*\.html$。 这分解为:

  • ^ 表示行首,所以^a 表示以“a”开头
  • . 是任何字符,正好是一个
  • .* 是 0 个或多个任意字符
  • \. 是一个“。”
  • $ 表示行尾,所以html$ 表示以“html”结尾

这是将其应用于您的示例的一种方法:

(cd testDir && ls | grep '^a..z.*\.html$')

【讨论】:

  • 感谢您如此明确的回复!最终我想出了一个类似的 grep 解决方案,但具有原生模式匹配的解决方案似乎更简单。
【解决方案2】:

这个怎么样:

ls -d testDir/a??z* |grep -e '.html$'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 2022-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    相关资源
    最近更新 更多