grep *.c 不起作用

grep *.c 不起作用

我在当前目录中有一个“.c”(c 文件)列表。

我必须找到当前目录中的所有 .c 文件。

可以使用的命令 id ls *.c

但是,另一种方法是使用 grep。

所以如果我给

 ls | grep *.c

它没有返回该命令的任何结果,而对于其他文件类型(如“ .java”,“ .txt”),它会给出预期的结果。

grep 命令中的“*.c”有什么特殊含义吗?或者我可以知道这种行为的原因吗?

答案1

*.c是一个 glob 模式,而grep搜索正则表达式。

ls | grep '\.c$'如果您想查找所有以 结尾的文件,您需要.c

grep默认情况下匹配任何子字符串,而不是整个字符串,因此您不需要编写与文件名开头匹配的内容。如果您确实想编写它,它将.*在正则表达式中。.表示“除行尾之外的任何字符”,并*表示“任何数量(零个或多个)的上一个表达式”。

因为.在正则表达式中具有特殊含义,所以如果要匹配文字.,则需要用 对其进行转义\。因为\在 shell 中具有特殊含义,所以需要用单引号 ( ') 引用正则表达式。

为了确保仅在文件名末尾进行匹配,您可以使用$,它与行尾进行匹配。

答案2

或者使用 find,然后根据需要获取列表,例如

find . -name "*.c" -exec ls -al {} \;

查找非常有用。

答案3

grep 正在搜索文件内容以查找您的 REGEX,而不是文件名。

答案4

grep "*.c" 会逐字查找字符串 "*.c",即字符串“星号点 c”,而不会将其扩展为“所有带有 .c 扩展名的文件”,这就是为什么它在“ls”的输出中找不到任何内容的原因:

# 触摸 bc

# ls -1 | grep "*.c"

结果为空。

如果您想要扩展,则应使用 egrep(扩展的 grep),它可以执行正则表达式。但在这里它们略有不同:

# ls -1 | egrep ".*.c"
b.c

也就是说,正则表达式是:.*.c(任何非换行符乘以零次或更多次,任何非换行符[您可以将其转义为字面意义上的“点”],“c”)

相关内容