我在当前目录中有一个“.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”)