Linux find 命令的高级正则表达式

2023-10-20

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~.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux find 命令的高级正则表达式 的相关文章

  • 是否从页面缓存中的脏页面进行文件读取?

    当字节写入文件时 内核不会立即将这些字节写入磁盘 而是将这些字节存储在页缓存中的脏页中 回写缓存 问题是 如果在脏页刷新到磁盘之前发出文件读取 则将从缓存中的脏页提供字节 还是首先将脏页刷新到磁盘 然后进行磁盘读取以提供字节 将它们存储在进
  • CentOS目录结构是树形的吗?

    CentOS 上有相当于树的东西吗 如果你的 Centos 系统上没有安装 tree 无论如何我通常建议服务器设置使用最小安装磁盘 你应该在命令行中输入以下内容 yum install tree y 如果没有安装 那是因为您没有正确的存储库
  • 如何从 Linux 命令行获取视频文件的分辨率(宽度和高度)?

    我一直在挖掘 mplayer mencoder 和 ffmpeg 文档 但我似乎无法想出anything 我对输出格式不是特别挑剔 因为我可以使用正则表达式将其拉出来 我只是似乎无法首先获取数据 Use ffprobe https ffmp
  • numpy 未定义符号:PyFPE_jbuf

    我正在尝试使用一百万首歌曲数据集 为此我必须安装 python 表 numpy cython hdf5 numexpr 等 昨天我设法安装了我需要的所有内容 在使用 hdf5 遇到一些麻烦之后 我下载了预编译的二进制包并将它们保存在我的 b
  • 如何获取 linux 实用程序 tail 的源代码?

    这个命令确实非常有用 但是我可以在哪里获取源代码以查看内部发生的情况 thanks tail 实用程序是 Linux 上 coreutils 的一部分 源压缩包 ftp ftp gnu org gnu coreutils coreutils
  • git在Windows和Linux之间切换后强制刷新索引

    我有一个Windows和Linux共享的磁盘分区 格式 NTFS 它包含一个 git 存储库 约 6 7 GB 如果我只使用Windows or 只使用Linux操作 git 存储库一切正常 但是每次切换系统的时候git status命令将
  • 无法安装 WWW::Curl::Easy: SZBALINT/WWW-Curl-4.17.tar.gz : make NO

    我正在尝试在我的 Fedora 26 机器上安装 WWW Curl Easy gcc c I usr include D REENTRANT D GNU SOURCE O2 g pipe Wall Werror format securit
  • 为什么在 Linux 上字符串文字的内存地址与其他字符串文字的内存地址如此不同?

    我注意到字符串文字在内存中的地址与其他常量和变量 Linux 操作系统 非常不同 它们有许多前导零 未打印 Example const char h Hi int i 1 printf p n void h printf p n void
  • 无法执行'x86_64-conda_cos6-linux-gnu-gcc':没有这样的文件或目录(pysam安装)

    我正在尝试安装 pysam 执行后 python path to pysam master setup py build 这个错误的产生是 unable to execute x86 64 conda cos6 linux gnu gcc
  • Linux 中热插拔设备时检测设备是否存在

    我正在运行 SPIcode http lxr free electrons com source drivers spi spi omap2 mcspi c在熊猫板上 我想知道其中的哪个功能code http lxr free electr
  • 如何在Python中独立于语言安装(linux)获取用户桌面路径

    我找到了 如何找到用户桌面的路径 的几个问题和答案 但在我看来它们都已失效 至少我找到的那些 原因是 如果用户安装的 Linux 不是英语 他或她的桌面很可能位于除 Desktop 例如 对于瑞典语 我相信它是在 Skrivbord 谁知道
  • sleep 0 有特殊含义吗?

    我看到很多用法sleep 0在我的一个客户项目中 代码看起来像这样 while true sleep 0 end 阅读一些像这样的答案this https stackoverflow com questions 3727420 signif
  • C 程序从连接到系统的 USB 设备读取数据

    我正在尝试从连接到系统 USB 端口的 USB 设备 例如随身碟 获取数据 在这里 我可以打开设备文件并读取一些随机原始数据 但我想获取像 minicom teraterm 这样的数据 请让我知道我可以使用哪些方法和库来成功完成此操作以及如
  • 无需 cron 在后台发送邮件

    我想知道是否有一种方法可以运行 PHP 循环 以便在后台向订阅者发送几百封电子邮件 我的目标是格式化新闻通讯 单击发送 然后关闭浏览器或更改页面 当然 发送电子邮件的实际过程将在后台运行 不会因浏览器关闭而中断 我知道这可以通过 cron
  • 设置 Apache POI 的路径

    我想创建 Excel 文件并使用 java 程序在该文件中写入数据 That is here http www techbrainwave com p 554我在 java 文件所在的位置提取了 Apache POI 并将该路径包含在路径变
  • 让 MongoDB 在 Linux 上监听远程连接

    我已在 Windows 本地计算机上 上成功安装 MongoDB 作为服务 但现在我想将 MongoDb 移动到单独的服务器 所以我将 tarball 解压到网络上的虚拟服务器 运行 Linux 当我从本地计算机使用 PuTTY 连接到服务
  • 在 /dev/input/eventX 中写入事件需要哪些命令?

    我正在开发一个android需要将触摸事件发送到 dev input eventX 的应用程序 我知道C执行此类操作的代码结构如下 struct input event struct timeval time unsigned short
  • 并行运行 make 时出错

    考虑以下制作 all a b a echo a exit 1 b echo b start sleep 1 echo b end 当运行它时make j2我收到以下输出 echo a echo b start a exit 1 b star
  • 嵌入式Linux poll()不断返回

    我有一个特别的问题 当我知道没有什么可读时 民意调查不断返回 因此设置如下 我有 2 个文件描述符 它们构成fd设置民意调查监视 一种用于引脚从高到低的变化 GPIO 另一个用于代理输入 代理输入出现问题 处理的顺序是 启动main函数 然
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte

随机推荐

  • 每个周日(每周)运行一个 Cron 作业

    许多应用程序需要每周执行 cron 作业来执行一些任务 例如 执行每周维护 清理磁盘空间 清理邮件列表和其他任务 您可以在一周中的任何一天运行每周任务 需要CPU和内存的作业需要消耗CPU和内存 这些工作最好在周末进行 安排周日的 Cron
  • 如何在 CentOS/RHEL 7 上安装 NVM

    NVM代表 Node Version Manager 是一个用于管理 Node 版本的命令行实用程序 有时您需要部署具有不同 2 个版本的多个节点应用程序 管理不同 2 项目的多个 Node js 版本对于开发人员来说是一件痛苦的事情 但
  • 如何在 Fedora 29-25、CentOS 7/6 上安装 VirtualBox 来宾添加

    The 虚拟盒子Guest Additions 提供了一些设备驱动程序和应用程序 用于优化来宾操作系统的性能和可用性 它安装在来宾操作系统内 因此 您需要在系统上运行的每个虚拟机上安装 我建议安装或升级 VirtualBox最新版本优先 本
  • 如何在 Bash 中转义单引号

    Bash 脚本对于开发人员 系统管理员以及任何需要在 Unix 或 Linux 系统上自动执行任务的人来说是一项至关重要的技能 有时 您需要在 bash 脚本的字符串中使用单引号 但是 由于 bash 解释单引号的方式 如果处理不当 可能会
  • 如何在 Ubuntu 18.04 和 16.04 上安装 ownCloud 10

    ownCloud使用 Web 界面提供数据访问 它还提供跨设备同步和共享的选项 一切都在您的控制之下 使用 ownCloud 我们可以轻松地对每个用户的文件 ACL 实施限制 ownCloud 提供桌面客户端 Windows MAC Lin
  • 如何使用预准备语句防止 PHP 中的 SQL 注入

    SQL 注入是一种常见的攻击形式 针对使用 SQL 数据库的 Web 应用程序 在此类攻击中 攻击者利用应用程序代码中的漏洞注入恶意 SQL 语句 这些语句可能会危害数据库并可能泄露敏感信息 PHP 是一种流行的 Web 开发语言 通常与
  • 了解 Python 中的区分大小写

    Python 是使用最广泛的编程语言之一 以其简单性和可读性而闻名 然而 与许多语言一样 它具有新手和经验丰富的程序员都应该理解的独特特征 其中一项特征是区分大小写 在本指南中 我们将深入了解 Python 中的大小写敏感性及其重要性 什么
  • 如何设置 SFTP Chroot Jail

    如果您是管理 Linux 服务器的系统管理员 您可能需要向某些用户授予 SFTP 访问权限 以将文件上传到他们的主目录 默认情况下 可以通过SSH SFTP等方式登录系统的用户SCP可以浏览整个文件系统 包括其他用户的目录 如果这些用户是可
  • 如何在 Linux 中终止进程

    您是否遇到过这样的情况 您启动了一个应用程序 但在使用该应用程序时突然变得无响应并意外崩溃 您尝试再次启动应用程序 但没有任何反应 因为原始应用程序进程从未真正完全关闭 好吧 我们所有人都曾在某个时刻发生过这种事 不是吗 解决方案是终止或终
  • 如何在 CentOS 7 上设置 SSH 密钥

    Secure Shell SSH 是一种加密网络协议 专为客户端和服务器之间的安全连接而设计 两种最流行的 SSH 身份验证机制是基于密码的身份验证和基于公钥的身份验证 使用 SSH 密钥通常比传统的密码身份验证更安全 更方便 本教程介绍如
  • 如何重命名本地和远程 Git 分支

    您正在与一群人合作开发一个项目 并且您已经为 git 分支定义了命名约定 你创建了一个新分支 将更改推送到远程存储库 并意识到您的分支名称不正确 幸运的是 Git 允许您使用以下命令轻松地重命名分支 git branch m命令 本指南介绍
  • 了解 Linux 文件权限

    在 Linux 中 文件权限 属性和所有权控制系统进程和用户对文件的访问级别 这确保只有授权的用户和进程才能访问特定的文件和目录 Linux 文件权限 基本的 Linux 权限模型的工作原理是将每个系统文件与所有者和组相关联 并为三类不同的
  • Python 字符串替换

    在本文中 我们将讨论如何在 Python 中使用replace method replace 方法 在Python中 字符串被表示为不可变的str对象 这str类附带了许多允许您操作字符串的方法 The replace 方法采用以下语法 s
  • 如何在 Ubuntu 18.04 上安装 Sublime Text 3

    崇高的文字是用于 Web 和软件开发的最广泛使用的文本和源代码编辑器之一 它速度非常快 并且具有许多开箱即用的强大功能 您可以通过安装新插件和创建自定义设置来增强其功能 在本教程中 我们将向您展示如何在 Ubuntu 18 04 计算机上安
  • Linux 中的 rmmod 命令

    每个Linux操作系统的核心组件是Linux内核 它管理系统的资源 并充当计算机硬件和软件之间的中介 Linux内核是一个采用模块化设计的软件 内核模块 通常称为驱动程序 是扩展内核功能的一段代码 模块可以编译为可加载模块或内置到内核中 可
  • 如何在 Windows 上创建可启动的 Ubuntu U 盘

    本教程将引导您完成在 Windows 上创建可启动 Ubuntu U 盘的过程 您可以使用此 U 盘来启动并测试或在任何支持从 USB 启动的计算机上安装 Ubuntu 先决条件 4GB 或更大的 USB 记忆棒驱动器 Microsoft
  • 如何在 CentOS 8 上安装 Ruby

    Ruby 是当今最流行的语言之一 它具有优雅的语法 并且是 Ruby on Rails 框架背后的语言 在本文中 我们将探索在 CentOS 8 上安装 Ruby 的不同方法 我们将展示如何从默认的 CentOS 8 存储库并使用 Rben
  • 如何在 Vim / Vi 中复制、剪切和粘贴

    处理文本文件时 复制 剪切和粘贴文本是最常执行的任务之一 Vim 或其前身 Vi 预装在 macOS 和几乎所有 Linux 发行版上 在您最喜欢的编辑器不可用的情况下 了解 Vim 的基础知识会很有帮助 本文介绍如何在 Vim Vi 编辑
  • 如何创建并列出本地和远程 Git 分支

    分支是软件开发过程的一部分 也是 Git 中最强大的功能之一 分支本质上是指向某个提交的指针 当修复错误或开发新功能时 开发人员正在创建一个新分支 稍后可以将其合并到主代码库中 本文介绍如何创建和列出本地和远程 Git 分支 列出 Git
  • Linux find 命令的高级正则表达式

    The 查找命令Linux 中允许您根据不同的条件在目录层次结构中搜索文件和目录 的一项强大功能find是它使用正则表达式进行搜索的能力 正则表达式 或简称 regex 提供了一种匹配字符串中字符序列的方法 目录 hide 1 正则表达式引