首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >获取包含字符串或模式的文件列表

获取包含字符串或模式的文件列表
EN

Stack Overflow用户
提问于 2022-02-20 10:57:19
回答 1查看 928关注 0票数 1

是否存在用于检索文件夹中的文件列表或包含给定字符串、字符串集或模式的文件夹集的分级模式?

我的项目产生RPM,并且正在使用Nebula类型(伟大的软件包!)有几种不同类型的文件需要后处理。我试图生成包含字符串的文件列表,这些字符串是后处理的指示符。例如,包含"@ doc“的文件需要由doc生成器脚本处理。包含"@HOSTNAME@“和"@HOSTFQDN@”的文件需要由sed处理,以便用实际主机名或主机fqdn替换字符串。

包中的搜索根目录将是src\main\resources。其结果是,构建脚本设置后安装脚本命令--类似于:

代码语言:javascript
代码运行次数:0
运行
复制
postInstall('/opt/product/bin/postprocess.sh ' + join(filesContainingDocs, " "))
postInstall('/bin/sed -i -e "s/@HOSTNAME@/$(hostname -s)/" -e s/@HOSTFQDN@/$(hostname)/" ' + join(filesContainingHostname, " ")

我可以搞清楚后置语法。我很难找到对文件内容(而不是文件名称)进行操作的任何常规Gradle 'things‘(即FileTree)的过滤器。我将如何填充filesContainingDocs和filesContainingHostname --大致如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
filesContainingDocs = FileTree('src/main/resources', { contents.matches('@doc') }
filesContainingHostname = FileTree('src/main/resources', { contents.matches('@(HOSTNAME|HOSTFQDN)@') }

虽然后处理脚本可以简单地执行grep,但我们产品中的几个RPM相互覆盖,每个RPM只应该对它提供的文件进行后处理,所以在最终安装的文件夹上建立一个通用的grep是不可行的--它会捕获其他RPM提供的文件。在我看来,在构建时,我应该能够从包含给定RPM项目的更多源文件中生成正确的静态文件列表。

它不必是FileTree --运行像findstr /s /m /c:"@doc" src\main\resources\*.conf这样的命令(唉,构建平台是findstr /s /m /c:"@doc" src\main\resources\*.conf)会在stdout中生成答案,但我不知道如何将这个结果放入一个对象Gradle可以用来扩展结果的对象。(我还怀疑有一种“更沉重的方式”来做到这一点。)

文件集和这些文件的内容通常是相当小的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-21 00:40:20

--我很难找到对文件内容(而不是文件名称)进行操作的任何常规Gradle 'things‘(即FileTree)的过滤器。

您可以在Gradle文件树上应用任何您可以想象到的过滤器,最后它只是在JVM中运行的Groovy (或Kotlin)代码。每个级别的FileTree只不过是File对象的一个(延迟计算的)集合。为了过滤这些File对象,您可以读取它们的内容,例如,用同样的方式在Java中读取它们。Groovy甚至提供了一个JDK enhancement for the Java class File,其中包括用于此目的的简单方法getText()。现在,您可以轻松地筛选包含特定字符串的文件:

代码语言:javascript
代码运行次数:0
运行
复制
filesContainingDocs = fileTree('src/main/resources').filter { file ->
    file.text.contains('@doc')
}

使用Groovy,您可以像.getText()一样以访问字段的方式调用getter(本例中是.text)。

如果一个简单的contains检查还不够,Groovy增强甚至提供了CharSequence/string实例上的matches(Pattern pattern)方法来执行常规的扩展检查:

代码语言:javascript
代码运行次数:0
运行
复制
filesContainingDocs = fileTree('src/main/resources').filter { file ->
    file.text.replace('\r\n','\n').matches('.*some regex.*') }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71193701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档