通过grep匹配动态排除文件

时间:2019-04-18 00:32:11

标签: grep find echo xargs

我有一个文件source-push.sh,它返回要从find命令结果中排除的文件列表。

它看起来像这样:

#!/usr/bin/env bash
find . -not \( -path './node_modules' -prune \) -name '*.js' | grep -vE $(echo $(./source-push.sh | xargs -I{} echo -n "{}|") | rev | cut -b2- | rev) | xargs -L1 standard --fix
find . -not \( -path './node_modules' -prune \) -name '*.css' | grep -vE $(echo $(./source-push.sh | xargs -I{} echo -n "{}|") | rev | cut -b2- | rev) | xargs -L1 stylelint --config stylelint.json

应该有一种方法可以做得更好。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

代替:

... | grep -vE $(echo $(./source-push.sh | xargs -I{} echo -n "{}|") | rev | cut -b2- | rev ) | ...

您可以使用POSIX选项-F-f

... | grep -v -F -f <( ./source-push.sh ) | ...
  • -F告诉grep模式是固定字符串
    • (避免了以下问题:如果模式包含grep -E专用字符,则原始代码会中断)
  • -f file告诉grep使用file中的模式列表
  • <( ... )是一种bash方式,可以将程序输出显示为文件(命名管道)