The 查找命令Linux 中允许您根据不同的条件在目录层次结构中搜索文件和目录。
的一项强大功能find
是它使用正则表达式进行搜索的能力。正则表达式(或简称 regex)提供了一种匹配字符串中字符序列的方法。
正则表达式引擎 (BRE) 和 (ERE)
find
命令支持基本正则表达式(BRE)和扩展正则表达式(ERE)。
BRE:使用更有限的元字符集。一些元字符,例如+
, ?
, and |
,在 BRE 中不存在,并且它们的使用需要反斜杠。
find /path -regex 'pattern_using_BRE'
ERE:提供更广泛的元字符集并且更具表现力。您可以使用以下命令切换到 ERE-E
选项与find
.
find /path -E -regex 'pattern_using_ERE'
下表总结了 BRE 和 ERE 之间的区别:
Feature |
BRE |
ERE |
Metacharacters |
Limited set: . * ^ $ [ ] |
Extended set including: . * ^ $ [ ] + ? { } |
Usage with find |
Default mode for -regex |
Use -E option
|
Grouping |
Not supported |
Supported with () |
Alternation |
Not supported |
Supported with | |
Escaping metacharacters |
\ used to escape metacharacters |
\ used to escape and introduce metacharacters |
Escaping . * ^ $ [ ] |
Required |
Not required |
了解完整路径匹配行为
当您使用-regex
选项与find
,它匹配整个路径,而不仅仅是文件名。记住这一点很重要,因为您的正则表达式应该考虑路径结构。
假设您有一个如下所示的目录结构:
/path/to/dir/
|
|-- fileA.txt
|-- subdirectory/
| |-- fileB.txt
如果执行:
find /path/to/dir -regex '.*fileA.txt'
您将匹配成功/path/to/dir/fileA.txt
.
但是,如果您执行:
find /path/to/dir -regex 'fileA.txt'
您不会得到任何匹配项。这是因为该模式需要考虑完整路径。
仅根据文件名进行匹配,你通常会结合find
与其他工具,如basename
或使用其他测试,例如-name
。例如:
find /path/to/dir -name 'fileA.txt'
仅根据文件名即可成功匹配。
了解特殊字符
这些是正则表达式中最常用的一些元字符:
-
.
: 匹配任意单个字符。
-
^
: 断言行的开头。
-
$
: 断言行结束。
-
*
:匹配前一个元素零次或多次。
-
+
:匹配前一个元素一次或多次。
-
?
:匹配前一个元素零次或一次。
-
\
:转义后面的字符,将任何元字符转换为文字。
-
|
:充当逻辑或。匹配之前的模式或之后的模式。
-
()
:将多个模式分组为一个单元。
这些元字符是正则表达式模式匹配的基础。
了解锚点
锚点是正则表达式中的特殊字符,表示字符串中的位置而不是实际内容。两个最常见的锚点是:
-
^
:这表示行或字符串的开头。
-
$
:这代表行或字符串的结尾。
实施例1:查找以“nginx”开头的配置文件:
find /etc/ -regex '.*/nginx[^/]*\.conf$'
该命令将找到类似的文件/etc/nginx/nginx.conf
or /etc/nginx/sites-available/nginx-default.conf
,但不是类似的东西/etc/apache2/nginx-mimic.conf
.
实施例2:找到以“2023-08”结尾的日志文件:
find /var/log/ -regex '.*2023-08[^/]*\.log$'
此命令标识日志文件,例如/var/log/syslog-2023-08-19.log
or /var/log/auth-2023-08-20.log
.
查找包含任何单个字符的文件
在正则表达式的上下文中,?
字符通常表示前面的字符或组出现零次或一次。
然而,当许多人考虑匹配任何单个字符时,他们可能指的是.
正则表达式中的字符。我们来介绍一下两者。
用点匹配任何单个字符
The .
正则表达式中的(点)是一个特殊字符,可以匹配除换行符之外的任何单个字符。
假设您有一个包含以下文件的目录:
dir/
|
|-- a1.txt
|-- a2.txt
|-- a3.txt
|-- aX.txt
|-- ab.txt
要查找具有“a,任何单个字符,.txt”模式的文件:
find dir/ -regex './a.\.txt'
这将匹配a1.txt
, a2.txt
, a3.txt
, and aX.txt
但不是ab.txt
因为它的“a”后面有两个字符。
指某东西的用途 ?在正则表达式中
The ?
在正则表达式中表示前面的字符或组出现零次或一次。当您不确定某个角色是否存在时,这会很有用。
如果您有名为color.txt
and colour.txt
并且您想匹配两者:
find dir/ -regex './colou?r\.txt'
此模式匹配两者color.txt
and colour.txt
,考虑可选的“u”。
使用+量词
假设您有一个包含日志文件的文件夹。有些日志具有日期格式,并且您想要挑选出专门具有数字的文件。
find logs/ -regex './log\d+\.txt'
这将匹配log1.txt
and log20230819.txt
,但排除log.txt
.
使用通配符 (*)
The *
字符被称为“通配符”,它与前面的字符或组匹配零次或多次出现。
The *
当您尝试匹配的字符数未知时,character 非常有用。
想象一个包含以下文件的目录:
docs/
|
|-- product.txt
|-- production.txt
|-- producer.txt
|-- produce.txt
要匹配以“product”开头后跟任意数量的字符的文件:
find docs/ -regex './produc.*\.txt'
这将匹配product.txt
, production.txt
, and produce.txt
, 但不是producer.txt
因为它不匹配.txt
以正则表达式结尾。
The *
通配符还可以匹配零次出现,从而有效地使前面的字符可选。
考虑名为data.txt
, data1.txt
, data12.txt
,等等:
find /path/ -regex './data[0-9]*\.txt'
这将匹配data.txt
(出现零次[0-9]
), data1.txt
, data12.txt
,以及任何其他以data
后面跟着零个或多个数字。
请记住,*
正则表达式中的通配符与*
shell 通配符中的通配符。
在壳里,*
匹配任何字符序列,但在正则表达式中,它指定前面的字符或组的数量。
定义自定义字符类
字符类允许您定义要匹配的特定字符集。
-
[...]
:匹配方括号内的任一字符。
-
[^...]
:匹配任何未包含在方括号中的字符。
find /path -regex '.*/file[123].*'
此命令搜索名为“file1”、“file2”或“file3”的文件。
另一方面:
find /path -regex '.*/file[^123].*'
这将搜索没有“file1”、“file2”或“file3”等名称的文件。
示例 1:查找以数字开头的文件
当你想查找以数字开头的文件或目录时,可以使用[0-9]
字符类。
find /path -regex '.*/[0-9].*'
此命令的目标是指定路径中以 0 到 9 之间的任意数字开头的文件或目录。
示例 2:排除以元音开头的文件
如果要排除以元音开头的文件或目录,可以使用[^...]
否定字符类的符号。
find /path -regex '.*/[^aeiouAEIOU].*'
此命令查找不以元音开头的文件或目录,同时考虑小写和大写元音。
认识简写
正则表达式为常见模式提供简写字符类:
-
\d
:匹配任意数字(0-9)。相当于[0-9].
-
\w
:匹配任何单词字符(字母数字字符加下划线)。相当于[a-zA-Z0-9_]
.
-
\s
:匹配任何空白字符(空格、制表符等)。
它们的大写字母代表否定:
-
\D
:匹配任何非数字。
-
\W
:匹配任何非单词字符。
-
\S
:匹配任何非空白字符。
find /path -regex '.*/\d.*'
该命令将查找以数字开头的文件或目录。
示例 1:查找名称中包含数字的文件
要查找名称中至少包含一位数字的文件或目录,您可以使用\d
速记。
find /path -regex '.*\d.*'
此命令在给定路径中搜索名称中包含 0 到 9 之间任何数字的文件或目录。
示例 2:定位包含单词字符的文件
要搜索包含单词字符的文件或目录,可以使用\w
与任何字母数字字符或下划线匹配的简写。
find /path -regex '.*\w.*'
该命令在指定路径中查找名称中至少包含一个单词字符的文件或目录。
示例 3:识别名称中含有空格的文件
文件保存时名称中带有空格,这些有时在脚本或自动化过程中可能会出现问题。你需要找到他们。
find media/ -regex '.*\s.*'
该命令将获取类似的文件summer photos.jpg
, project plan.docx
,但会排除诸如data_summary.xlsx
.
重复量词
量词决定前面的元素应该匹配多少次:
-
{n}
:与前一个精确匹配 n 次。
-
{n,}
:匹配前一个元素至少n次。
-
{n,m}
:匹配前一个元素 n 到 m 次(含)。
find /path -regex '.*file\d{3}.*'
此命令搜索名称中包含“file”后跟三位数字的文件或目录。
查找具有重复模式的文件
要识别具有重复模式的文件,请使用{n,m}
量词,您指定模式应出现的次数范围。
find /path -regex '.*pattern.{n,m}.*'
此命令将搜索名称中出现 n 到 m 次“pattern”一词的文件或目录。
假设您想要查找具有重复出现数字的模式的配置文件,例如 IP 地址或版本号。
find /path -regex '.*\(\d{1,3}\.\)\{3\}\d{1,3}.*'
此命令搜索类似于 IP 地址模式的文件名,例如“192.168.1.1”或“10.0.0.1”,其中每个数字可以是一到三位数字,并以句点分隔。
不区分大小写的搜索
有时,您可能希望执行不区分大小写字母的搜索。这-iregex
选项允许不区分大小写的匹配。
要查找名为“config”的文件(无论大小写):
find /path -iregex '.*config.*'
此命令查找名称包含“config”、“Config”、“CONFIG”或该单词的任何其他大小写变体的文件。
使用 | 混合多个模式
当您想要搜索与多种模式中的任何一种匹配的文件时,可以使用|
扩展正则表达式中的运算符。
示例 1:查找与多个扩展名之一匹配的文件
您有一个包含不同类型媒体文件的目录,并且您想要挑选出所有扩展名为 jpg、png 或 gif 的图像文件。
find media/ -regex '.*\.\(jpg\|png\|gif\)'
此命令匹配文件,例如photo.jpg
, icon.png
, and animation.gif
.
示例 2:通过多种命名约定定位文件
在配置目录中,可能有两种命名约定 - 以以下结尾的文件-config.txt
or -configuration.txt
.
find config/ -regex '.*\-\(config\|configuration\)\.txt'
这将匹配两者server-config.txt
and database-configuration.txt
.
示例 3:搜索备份或临时文件
备份(结束于.bak
)或临时文件(以~
)可能会累积。您想要在一个目录中识别它们。
find projects/ -regex '.*\.\(bak\|~\)'
该命令匹配类似的文件code.bak
or document.txt~
.