Linux技巧:find 命令简单入门介绍和问题点解析( 七 )


即,-regex expr 表达式用正则表达式匹配完整路径的文件名,包含目录路径部分 。
用正则表达式匹配后缀名为 .c 文件的例子如下:
$ find . -regex '.*.c'./src/main.c$ find . -regex '.*c'./src./src/main.c可以看到,find . -regex '.*.c' 命令只打印出后缀名为 .c 的文件名 。
而 find . -regex '.*c' 命令除了打印后缀名为 .c 的文件名,还打印了其他的文件名,这个命令的正则表达式不够精确,少了关键的 . 来转义匹配点号 . 字符 。
在 .*.c 这个正则表达式中,最前面的 . 表示匹配任意单个字符,* 表示匹配零个或连续多个前面的字符,. 通过转义来表示 . 字符自身,c 表示字符 c 自身,组合起来就是匹配后缀名为 .c 的字符串 。
而 .*c 这个正则表达式匹配最后一个字符为 c 的字符串,不管在字符 c 前面是否有 . 字符,这个不符合后缀名的要求 。
下面例子用正则表达式来匹配多个后缀名:
$ find . -regex '.*.(c|am)'./src/main.c./Makefile.am这个例子同时匹配后缀名为 .c 和 .am 的文件名 。
在正则表达式中,(a|b) 表示匹配 a 或者匹配 b 。上面的 (c|am) 经过转义后,也就是 (c|am),用于匹配 c 或者 am,这样就比较好理解,不要被转义字符吓到了 。
匹配特定类型的文件在 Linux 中,文件类型可以分为目录 (directory)、文本文件 (regular file)、符号链接 (symbolic link)、socket,等等 。
find 命令可以用 -type c 表达式来指定匹配这些类型的文件 。
这是一个 test 类型表达式,GNU find 在线帮助手册对该表达式的说明如下:

Test: -type c
True if the file is of type c:
d: directory
f: regular file
l: symbolic link
s: socket
例如,使用 -type f 来指定只匹配文本文件:
$ find . -type f./src/main.c./tests/bre.tests./Makefile.am可以看到,在打印结果里面,没有看到目录名,只有文本文件名 。
注意:-type f 表达式只表示匹配文本文件,并不表示只查找文本文件,find 命令还是会查找出所给目录的所有文件,并把每个文件名依次传给后面的表达式进行评估,只有符合 -type f 表达式的文件才会返回 true,才会被打印出来 。
不符合这个表达式的文件也会被查找到,只是没有打印出来而已 。




推荐阅读