正则表达式排除在find命令中搜索的文件类型

32

在Linux中使用find命令时,可以添加-regex标志,使用Emacs正则表达式进行匹配。

我希望find查找除了.jar文件和.ear文件之外的所有文件。在这种情况下,正则表达式是什么?

谢谢

答案: find -regex ".*\(\.jar\|\.ear\)$" -prune -o -type f -print
4个回答

49

你不需要使用正则表达式来解决这个问题。你可以使用 find 命令并结合 -name-not 选项:

find . -not -name "*.jar" -not -name "*.ear"
上述内容的更简洁(但较难读懂)版本是:
find . ! \( -name "*.jar" -o -name "*.ear" \)

我同意,正则表达式可能会过度。 - Tim Pietzcker
你说得对,但我正在尝试使其尽可能通用,因为我将其用作函数,并不知道最终用户的需求会是什么。 - Michael
除了一些文件之外,似乎可以使用复合条件'(' -not -regex 'MOST_EXCLUDE' -or -regex 'SOME_INCLUDE' ')'来排除大部分文件。 - eel ghEEz
-o前缀代表“或”以组合两种文件类型吗?它可以在任何其他Bash命令中使用吗? - pUTa432

15

编辑:新方法:

由于POSIX正则表达式不支持环视,因此您需要否定匹配结果:

find . -not -regex ".*\.[je]ar"

之前发布的答案使用了回顾后发,因此在这里无法使用,但为了完整起见,以下是该答案:

.*(?<!\.[je]ar)$

似乎无法在命令中使其工作。我正在使用 find . -type 'f' -regextype posix-extended -regex '.*(?<!\.[je]ar)$',但它给出了警告:您已在非选项参数-type之后指定了-regextype选项,但选项不是位置相关的(-regextype影响在其之前和之后指定的测试)。请在其他参数之前指定选项。 - Michael
听起来你需要在regex选项之后放置regextype选项。但是posix-extended听起来不太对;据我所知,POSIX没有lookaround。 - Tim Pietzcker
糟糕了。看起来 find 只支持 POSIX BRE/ERE 引擎。在这种情况下,这个解决方案根本行不通。对此感到抱歉(谁点赞了这个??)... - Tim Pietzcker
它表示有效的类型包括“findutils-default”、“awk”、“egrep”、“emacs”、“gnu-awk”、“grep”、“posix-awk”、“posix-basic”、“posix-egrep”、“posix-extended”。 - Michael

10
find . -regextype posix-extended -not -regex ".*\\.(jar|ear)"

这将完成任务,我个人认为比其他解决方案更清晰。不幸的是,-regextype是必需的(使简单的命令变得混乱),以使捕获组起作用。

我同意正则表达式并不过度,而且也很容易扩展。 - Pysis

0
在这种情况下使用正则表达式似乎有点过度(您可以只检查名称是否以某些内容结尾)。我不确定emacs语法,但是类似于这样的语句应该足够通用以运行:
\.(?!((jar$)|(ear$)))

即查找不以结束符($)“jar”或(|)“ear”结尾的句点(.)。


如果文件名中没有点,或者有多个点呢?(除了“-regex”选项匹配整个文件名而不仅仅是其中一部分之外) - Tim Pietzcker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接