查找所有 cpp 文件并仅列出那些名称与模式(正则表达式)匹配的文件不起作用

查找所有 cpp 文件并仅列出那些名称与模式(正则表达式)匹配的文件不起作用

我有一个完整的文件存储库,我正在尝试获取符合特定条件的文件列表。

例如,假设我想要获取路径中包含字符串foo1andfoo2/foo3且不包含bar1or 的所有文件bar2/bar3。请注意,它可能是bar1bar2/bar3的子目录foo*,在这种情况下,这些目录也应该是排除。我尝试了以下方法:

IN_REGEX="$1"
OUT_REGEX="$2"

find . -name '*'.cpp | grep $IN_REGEX | grep -v $OUT_REGEX

我这样称呼这个脚本:

 ./script "/foo1/\|/foo2\/foo3/" "/bar1/\|/bar2\/bar3/"

但是,循环永远不会被执行。我尝试将"命令行参数更改为'.但这并没有帮助。我尝试将greps 更改为sed命令,如下所示:

find . -name '*'.cpp | sed "\m%$IN_REGEX%" | sed "\%$OUT_REGEX%d"

再次,没有成功。但是,当我尝试直接在 bash shell 上执行时grep。它工作正常。我今天花了一整天时间试图弄清楚这一点。

有人可以帮我吗?

答案1

您可以使用!(negate) 和-path命令开关find来完成此操作

$ find . \( ! -path "*bar*" -a ! -path "*bar2\/bar3*" -a -path "*foo*" -print \)

这将在路径中搜索不包括barbar2/bar3和包含文件夹的文件夹。foo尝试一下。语法可能会随着find命令版本的不同而改变。

请参阅查找手册页以获取更多详细信息

答案2

如果您在收到参数时删除“第 1 行和第 2 行”,那么它似乎可以正常工作:

IN_REGEX=$1
OUT_REGEX=$2

find . -name '*'.cpp | grep $IN_REGEX | grep -v $OUT_REGEX

相关内容