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 命令的高级正则表达式 的相关文章

  • Linux 中的无缓冲 I/O

    我正在写入大量的数据 这些数据数周内都不会再次读取 由于我的程序运行 机器上的可用内存量 显示为 空闲 或 顶部 很快下降 我的内存量应用程序使用量不会增加 其他进程使用的内存量也不会增加 这让我相信内存正在被文件系统缓存消耗 因为我不打算
  • 使用 grep 查找包含所有搜索字符串的行

    我有一个文件 其中包含很多与此类似的行 id 2796 some model Profile message type MODEL SAVE fields account 14 address null modification times
  • 如何使用 bash 锁定文件

    我有一个任务从远程服务器同步目录 rsync av email protected cdn cgi l email protection srv data srv data 为了使其定期运行并避免脚本 reEnter 问题 我使用 rsyn
  • 如何使用 xterm.js 创建基于 Web 的终端以 ssh 进入本地网络上的系统

    我偶然发现了这个很棒的图书馆xterm js https xtermjs org 这也是 Visual Studio Code 终端的基础 我有一个非常普遍的问题 我想通过基于网络的终端 不在网络中 可能位于 aws 服务器上 访问本地网络
  • 如何根据 HTTP 请求使用 Python 和 Flask 执行 shell 命令并流输出?

    下列的这个帖子 https stackoverflow com questions 15092961 how to continuously display python output in a webpage 我能够tail f网页的日志
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach
  • 如何在bash中使用jq从变量中包含的json中提取值

    我正在编写一个 bash 脚本 其中存储了一个 json 值 现在我想使用 Jq 提取该 json 中的值 使用的代码是 json val code lyz1To6ZTWClDHSiaeXyxg redirect to http examp
  • 为什么内核需要虚拟寻址?

    在Linux中 每个进程都有其虚拟地址空间 例如 32位系统为4GB 其中3GB为进程保留 1GB为内核保留 这种虚拟寻址机制有助于隔离每个进程的地址空间 对于流程来说这是可以理解的 因为有很多流程 但既然我们只有 1 个内核 那么为什么我
  • Linux中的CONFIG_OF是什么?

    我看到它在很多地方被广泛使用 但不明白在什么场景下我需要使用它 What is 配置 OF OF 的全名是什么 打开固件 这是很久以前发明的 当时苹果公司正在生产基于 PowerPC CPU 的笔记本电脑 而 Sun Microsystem
  • 大多数 Linux 系统头文件与 C++ 兼容吗?

    大多数 Linux 系统头文件 API C 兼容吗 今天我试图做这样的事情 include
  • 在哪里可以找到并安装 pygame 的依赖项?

    我对 Linux 比较陌生 正在尝试安装 python 的 pygame 开发环境 当我运行 setup py 时 它说我需要安装以下依赖项 我找到并安装了其中之一 SDL 然而 其他人则更加难以捉摸 Hunting dependencie
  • nslookup 报告“无法解析 '(null)': 名称无法解析”,尽管它成功解析了 DNS 名称

    我在 ubuntu 上 并且正在运行 docker 默认桥接网络 我有 Zookeeper kafka 的容器化版本 以及我编写的与 kafka 对话的应用程序 I do a docker exec it
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • os.Mkdir 和 os.MkdirAll 权限

    我正在尝试在程序开始时创建一个日志文件 我需要检查是否 log如果不创建目录 则目录存在 然后继续创建日志文件 好吧 我尝试使用os Mkdir 也os MkdirAll 但无论我在第二个参数中输入什么值 我都会得到一个没有权限的锁定文件夹
  • 如何在shell中输出返回码?

    我正在尝试通过调用自定义 shell 脚本sh bin sh c myscript sh gt log txt 2 gt 1 echo 该命令的输出是创建的后台进程的 PID 我想指导 bin sh保存返回码myscript sh到某个文件
  • ubuntu:升级软件(cmake)-版本消歧(本地编译)[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我的机器上安装了 cmake 2 8 0 来自 ubuntu 软件包 二进制文件放置在 usr bin cmake 中 我需要将 cmake 版本至少
  • C语言中如何通过内存地址映射函数名和行号?

    如何用 GCC 中的内存地址映射回函数名称和行号 即假设一个 C 语言原型 void func Get the address of caller maybe this could be avoided MemoryAddress get
  • 为什么我可以直接从 bash 执行 JAR?

    我是一个长期从事 Java 工作的人 并且知道运行带有主类的 JAR 的方法MANIFEST MFJar 中的文件很简单 java jar theJar jar 我用它来启动 Fabric3 服务器 包含在bin server jar在其标
  • ftrace:仅打印trace_printk()的输出

    是否可以只转储trace printk 输出于trace文件 我的意思是过滤掉函数跟踪器 或任何其他跟踪器 中的所有函数 一般来说 您可以在选项目录中关闭选项 sys kernel debug tracing options Use ls显
  • 如何使用 GOPATH 的 Samba 服务器位置?

    我正在尝试将 GOPATH 设置为共享网络文件夹 当我进入 export GOPATH smb path to shared folder I get go GOPATH entry is relative must be absolute

随机推荐

  • 每个周日(每周)运行一个 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 正则表达式引