【问题标题】:Using regex in bash to find files在 bash 中使用正则表达式查找文件
【发布时间】:2012-11-30 12:09:15
【问题描述】:

基本上我要做的是列出具有特定扩展名的当前目录的内容(在我的例子中是 .c 文件)。

所以我认为可行的是:

ls | grep .\*\.c

它主要工作,但也返回以 c 结尾的文件,如

  1. 音乐(这是一个目录)
  2. test.doc

我的正则表达式是否有问题,因为我看不到它。

非常感谢

【问题讨论】:

    标签: regex bash shell scripting


    【解决方案1】:

    您可以这样做:

    find -name "*.c"
    

    它会从当前工作目录递归地为您找到所有带有.c 扩展名的文件。

    或者,如果您想要非递归并希望使用ls 来实现,您可以这样做:

    ls *.c
    

    如果您想知道如何将带有grep 的正则表达式应用于ls 搜索结果(尽管这更麻烦):

    ls | grep ".*\.c$"
    

    正则解释:

    • . - 匹配任意字符
    • .* - 匹配任意字符零次或多次
    • .*\. - 匹配任意字符零次或多次,然后按字面意思匹配.(通过使用\“转义”它来指定)
    • ".*\.c - 匹配任何字符零次或多次,然后匹配 . 字面意思,然后匹配字符 c
    • .*\.c$ - 匹配任何字符零次或多次,然后匹配 . 字面意思,然后匹配字符 c;并且仅当这是模式的结尾(在那之后没有更多的东西)。 $ 是“结束”的正则表达式锚。

    【讨论】:

    • 提到递归查找搜索。
    【解决方案2】:

    你需要转义你的反斜杠:

    ls | grep .*\\.c
    

    【讨论】:

    • 非常感谢。完美运行。我可以问你为什么需要转义反斜杠吗?据我了解,正则表达式意味着 0 或更多的任何东西,后跟 \ 后跟任何东西之一,然后是 c。我在这里错过了什么吗!
    • @djjavo 通常在 bash 中反斜杠表示“转义下一个字符”,因此要为正则表达式使用实际的反斜杠,您需要转义它。
    • 是的,我理解 \ 是转义字符,但我不明白为什么我们需要在正则表达式中使用实际的反斜杠(因为它的 somecode.c 而不是 somecode\.c)我是不是很愚蠢因为我不懂!?
    • 在正则表达式中,. 匹配任何字符,因此您必须转义 . 以匹配实际的 .
    • 是的,我知道,但是您是否有“\\”然后您正在转义转义字符??
    【解决方案3】:

    你很接近

    ls | grep \\.c$
    

    查看双反斜杠

    【讨论】:

      【解决方案4】:

      您可以简单地使用ls *.c 列出当前目录中具有.c 扩展名的所有文件。

      【讨论】:

      • 感谢安德鲁 - 不知道这一点。抱歉,如果我的问题不清楚,但我更喜欢使用 ls | grep。非常感谢您的帮助,非常感谢:)
      猜你喜欢
      • 2013-07-07
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 2011-05-10
      • 1970-01-01
      • 2013-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多