排除匹配项的文件模式

filepatterns to exclude a match

Shake 使用各种形式的匹配,文件路径与模式。有没有可以用来排除模式的?

示例: 我有三个目录 a, b, c(在目录 x 中的某处),每个目录都需要 html 个文件。有一条规则

(dir <> "//*.html") %> \out -> do -- deal with a and b

应该只处理目录a 和b 以及类似的规则来处理c 中的文件。

有没有办法(也许使用?>)将两个规则分开一个

(\f -> "x" prefixOf f && not "x/c" prefixOf f) <> "//*.html")
(\f -> "x/x" prefixOf f ) <> "//*.html")

和另一个类似?

使用 xx.a.htmlxx.b.html 的推荐方法在这里是不可能的,因为文件是用其他需要常规 html 扩展名的程序处理的。

或者

规则:

pattern %> action

相当于:

(pattern ?==) ?> action

所以你可以这样写:

(\x -> "//*.html" ?== x && not ("c//*.html" ?== x) ?> action

匹配规则匹配 //*.html,但不匹配 c//*.html

更一般地说,根本不需要使用 FilePattern ?== 运算符,因此可以使用任意匹配谓词。

有了建议(尤其是关于使用 **/*.html 的提示),我已经开始工作了。 路径 bakedDstaticD 的前缀,第一个规则只处理 bakedD 中不在 staticD 中的文件,另一个只处理这些文件:

(\x -> ((bakedD <> "**/*.html") ?== x) 
     && not  ((staticD <> "**/*.html") ?== x)) ?> \out -> do
            let md =   doughD </>  (makeRelative bakedD $ out -<.> "md")
            runErr2action $ bakeOneFileFPs  md  doughD templatesD out

(staticD <> "**/*.html" ) %> \out -> do
        copyFileChanged (replaceDirectory out doughD) out

两条规则之间没有重叠。

我希望这对遇到相同类型问题的其他人有用。