如何使用正则表达式和 find 命令?

2024-10-09 09:11:00
admin
原创
228
摘要:问题描述:我有一些用生成的uuid1字符串命名的图像。例如。我想使用“ ”命令81397018-b84a-11e0-9d2a-001b77dc0bed.jpg找出所有这些图像:findfind . -regex "[a-f0-9-]{36}.jpg". 但它不起作用。正则表...

问题描述:

我有一些用生成的uuid1字符串命名的图像。例如。我想使用“ ”命令81397018-b84a-11e0-9d2a-001b77dc0bed.jpg找出所有这些图像:find

find . -regex "[a-f0-9-]{36}.jpg".

但它不起作用。正则表达式有问题吗?


解决方案 1:

find . -regextype sed -regex ".*/[a-f0-9-]{36}.jpg"

请注意,您需要.*/在开始时指定,因为find匹配整个路径。

例子:

susam@nifty:~/so$ find . -name "*.jpg"
./foo-111.jpg
./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
susam@nifty:~/so$ 
susam@nifty:~/so$ find . -regextype sed -regex ".*/[a-f0-9-]{36}.jpg"
./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg

我的发现版本:

$ find --version
find (GNU findutils) 4.4.2
Copyright (C) 2007 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Built using GNU gnulib version e5573b1bad88bfabcda181b9e0125fb0c52b7d3b
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS() CBO(level=0) 
susam@nifty:~/so$ 
susam@nifty:~/so$ find . -regextype foo -regex ".*/[a-f0-9-]{36}.jpg"
find: Unknown regular expression type `foo'; valid types are `findutils-default', `awk', `egrep', `ed', `emacs', `gnu-awk', `grep', `posix-awk', `posix-basic', `posix-egrep', `posix-extended', `posix-minimal-basic', `sed'.

解决方案 2:

find-regex表达式匹配整个名称,包括当前目录的相对路径。因为find .它总是以 开头./,然后是任何目录。

此外,这些是emacs正则表达式,它们具有与通常的 egrep 正则表达式不同的转义规则。

如果这些都直接在当前目录中,那么

find . -regex './[a-f0-9-]{36}.jpg'

应该可以工作。(我不太确定 - 我无法让计数重复在这里起作用。)您可以通过以下方式切换到 egrep 表达式-regextype posix-egrep

find . -regextype posix-egrep -regex './[a-f0-9-]{36}.jpg'

(请注意,这里所说的一切都是针对 GNU 查找的,我对 Mac 上的默认查找即 BSD 查找一无所知。)

解决方案 3:

从其他答案来看,这似乎可能是 find 的错误。

但是你也可以用下面的方法来实现:

find . * | grep -P "[a-f0-9-]{36}.jpg"

您可能需要稍微调整 grep 并根据需要使用不同的选项,但它可以起作用。

解决方案 4:

在 Mac OS X (BSD 查找) 上:与接受的答案效果相同。

$ find -E . -regex ".*/[a-f0-9-]{36}.jpg"

man find-E使用扩展的正则表达式支持

注意:.*/需要前缀来匹配完整路径:

为了进行比较,这里是 GNU/Linux 版本:

$ find . -regextype sed -regex ".*/[a-f0-9-]{36}.jpg"

解决方案 5:

简单的方法 - 您可以在开头指定 .* 因为 find 匹配整个路径。

$ find . -regextype egrep -regex '.*[a-f0-9-]{36}.jpg$'

查找版本

$ find --version
find (GNU findutils) 4.6.0
Copyright (C) 2015 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
<http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION 
FTS(FTS_CWDFD) CBO(level=2)

解决方案 6:

尝试使用单引号 (') 来避免 shell 转义字符串。请记住,表达式需要匹配整个路径,即需要看起来像:

find . -regex './[a-f0-9-]*.jpg'

除此之外,我的 find (GNU 4.4.2) 似乎只识别基本正则表达式,尤其是 {36} 语法。我认为你只能在没有它的情况下凑合着用。

解决方案 7:

使用正则表达式应用 find 指令时,应使用绝对目录路径。在您的示例中,

find . -regex "[a-f0-9-]{36}.jpg"

应该改为

find . -regex "./[a-f0-9-]{36}.jpg"

在大多数 Linux 系统中,正则表达式中的一些规则无法被该系统识别,因此你必须明确指出 -regexty,例如

find . -regextype posix-extended -regex "[a-f0-9-]{36}.jpg"

解决方案 8:

find如果要保持跨平台兼容性,我找不到能够以一致的方式在不同版本之间工作的内置正则表达式搜索选项。

与 grep 结合

  1. 按照@yarian 的建议,您可以运行过度包含的查找,然后通过 grep 运行输出:

find . | grep -E '<POSIX regex>'

这可能会很慢,但如果您需要使用完整的正则表达式并且无法将搜索重新格式化为glob,它将为您提供跨平台的正则表达式搜索

重写为 glob

  1. -name选项与 glob 兼容,可提供有限的(但跨平台的)模式匹配。

您可以使用命令行上的所有模式,例如* ? {} **。虽然不如完整正则表达式强大,但您可以根据用例将搜索重新表述为 glob。

互联网搜索glob - 网上有很多详细介绍完整功能的教程

解决方案 9:

我没有看到的一件事是如何将正则表达式与常规查找语法结合起来。

例如:我想在 BSD / Linux 上查找核心转储文件,我更改为我想要扫描的根目录..例如:cd /然后执行:

find ( -path "./dev" -o -path "./sys" -o -path "./proc" ) -prune -o -type f -regextype sed -regex ".*.core$" -exec du -h {} ; 2> /dev/null

因此,我使用 prune 命令排除多个系统目录,然后对剩余文件进行正则表达式处理。所有错误输出 (stderr) 都将被删除。

重要的部分是首先使用 Find 语法,然后与正则表达式进行 OR (-o)。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2911  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1774  
  PLM(产品生命周期管理)系统在企业的产品研发、生产与管理过程中扮演着至关重要的角色。然而,在实际运行中,资源冲突是经常会遇到的难题。资源冲突可能导致项目进度延迟、成本增加以及产品质量下降等一系列问题,严重影响企业的效益与竞争力。因此,如何有效应对PLM系统中的资源冲突,成为众多企业关注的焦点。接下来,我们将详细探讨5...
plm项目管理系统   0  
  敏捷项目管理与产品生命周期管理(PLM)的融合,正成为企业在复杂多变的市场环境中提升研发效率、增强竞争力的关键举措。随着技术的飞速发展和市场需求的快速更迭,传统的研发流程面临着诸多挑战,而将敏捷项目管理理念融入PLM,有望在2025年实现研发流程的深度优化,为企业创造更大的价值。理解敏捷项目管理与PLM的核心概念敏捷项...
plm项目   0  
  模块化设计在现代产品开发中扮演着至关重要的角色,它能够提升产品开发效率、降低成本、增强产品的可维护性与可扩展性。而产品生命周期管理(PLM)系统作为整合产品全生命周期信息的关键平台,对模块化设计有着强大的支持能力。随着技术的不断发展,到 2025 年,PLM 系统在支持模块化设计方面将有一系列令人瞩目的技术实践。数字化...
plm软件   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用