在Linux中使用find
命令时,可以添加-regex
标志,使用Emacs正则表达式进行匹配。
我希望find查找除了.jar
文件和.ear
文件之外的所有文件。在这种情况下,正则表达式是什么?
谢谢
答案:find -regex ".*\(\.jar\|\.ear\)$" -prune -o -type f -print
你不需要使用正则表达式来解决这个问题。你可以使用 find
命令并结合 -name
和 -not
选项:
find . -not -name "*.jar" -not -name "*.ear"
上述内容的更简洁(但较难读懂)版本是:find . ! \( -name "*.jar" -o -name "*.ear" \)
编辑:新方法:
由于POSIX正则表达式不支持环视,因此您需要否定匹配结果:
find . -not -regex ".*\.[je]ar"
之前发布的答案使用了回顾后发,因此在这里无法使用,但为了完整起见,以下是该答案:
.*(?<!\.[je]ar)$
find . -type 'f' -regextype posix-extended -regex '.*(?<!\.[je]ar)$'
,但它给出了警告:您已在非选项参数-type之后指定了-regextype选项,但选项不是位置相关的(-regextype影响在其之前和之后指定的测试)。请在其他参数之前指定选项。 - Michaelregex
选项之后放置regextype
选项。但是posix-extended
听起来不太对;据我所知,POSIX没有lookaround。 - Tim Pietzckerfind
只支持 POSIX BRE/ERE 引擎。在这种情况下,这个解决方案根本行不通。对此感到抱歉(谁点赞了这个??)... - Tim Pietzckerfind . -regextype posix-extended -not -regex ".*\\.(jar|ear)"
\.(?!((jar$)|(ear$)))
即查找不以结束符($)“jar”或(|)“ear”结尾的句点(.)。
'(' -not -regex 'MOST_EXCLUDE' -or -regex 'SOME_INCLUDE' ')'
来排除大部分文件。 - eel ghEEz