我有一个完整的文件存储库,我正在尝试获取符合特定条件的文件列表。
例如,假设我想要获取路径中包含字符串foo1
andfoo2/foo3
且不包含bar1
or 的所有文件bar2/bar3
。请注意,它可能是bar1
或bar2/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/"
但是,循环永远不会被执行。我尝试将"
命令行参数更改为'
.但这并没有帮助。我尝试将grep
s 更改为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 \)
这将在路径中搜索不包括bar
、bar2/bar3
和包含文件夹的文件夹。foo
尝试一下。语法可能会随着find
命令版本的不同而改变。
答案2
如果您在收到参数时删除“第 1 行和第 2 行”,那么它似乎可以正常工作:
IN_REGEX=$1
OUT_REGEX=$2
find . -name '*'.cpp | grep $IN_REGEX | grep -v $OUT_REGEX