在bash中使用正则表达式查找文件

3

我想要做的事情基本上是列出当前目录下特定扩展名(在我的情况下是.c文件)的所有内容。

所以我认为会起作用的是:

ls | grep .\*\.c

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

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

我无法发现我的正则表达式有什么问题。请问这是什么原因?

非常感谢。

4个回答

4
你可以使用 ls *.c 命令来列出当前目录下所有扩展名为.c的文件。

谢谢你的帮助,安德鲁 - 我不知道这个。如果我在问题中没有表达清楚,对不起,但我更喜欢使用ls | grep。非常感谢你的帮助,我非常感激 :) - djjavo

3
以下是您可以做的事情:

以下是您可以做的事情:

find -name "*.c"

如果您想要递归地从当前工作目录查找所有扩展名为.c的文件,可以使用以下命令:

find . -name "*.c"

另外,如果您不想递归查找,并希望使用ls命令来完成此操作,可以执行以下命令:

ls *.c
ls *.c

如果您想了解如何使用 grep 正则表达式在 ls 搜索结果中进行匹配(尽管这更加繁琐):
ls | grep ".*\.c$"
< p > 正则表达式说明:

  • . - 匹配任何字符
  • .* - 匹配零个或多个任意字符
  • .*\. - 匹配零个或多个任意字符,然后匹配一个.(通过使用\进行“转义”)
  • ".*\.c - 匹配零个或多个任意字符,然后匹配一个.(通过使用\进行“转义”),然后匹配字符c
  • .*\.c$ - 匹配零个或多个任意字符,然后匹配一个.(通过使用\进行“转义”),然后匹配字符c;仅当这是模式的结尾(后面没有其他内容时)。$ 是正则表达式锚点,表示“结尾”。

提到find命令时,它会递归搜索。 - Julien May

2

你已经很接近了

ls | grep \\.c$

请注意双反斜杠


1

你需要转义你的反斜杠:

ls | grep .*\\.c

1
非常感谢您。 它完美地运作。 我可以问一下为什么您需要转义反斜杠吗? 根据我的理解,该正则表达式意味着_0或更多任何东西,后跟\,后跟任何一个字符c_。 我有什么遗漏的吗! - djjavo
1
@djjavo 通常在bash中,反斜杠意味着“转义下一个字符”,因此要在正则表达式中使用实际的反斜杠,您需要对其进行转义。 - mVChr
是的,我理解“\”是转义字符,但我不明白为什么我们需要在正则表达式中使用实际的反斜杠(因为它是somecode.c而不是somecode.c)。难道我很蠢吗,因为我不明白吗? - djjavo
在正则表达式中,.匹配任何字符,因此您必须转义.才能匹配实际的. - Drake Clarris
是的,我知道,但如果你有“\”,那么你是在转义转义字符吗? - djjavo
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接