繁体   English   中英

npm 脚本删除目录中的所有文件,除了具有某些扩展名的文件(mac os)

[英]npm script to remove all files in directory except files with certain extensions (mac os)

我知道这里有很多类似的问题,但我还没有找到我正在寻找的答案。 这是我尝试在 npm 脚本中使用的命令。

rm -rf public/!(*.md)

我通过使用命令shopt -s extglob启用了扩展全局连接,并且该命令在终端中运行良好。 我遇到的问题是,当我使用与 npm 脚本相同的命令时,它不会运行。

剧本

"scripts": {
   // ...
   "clean:public": "rm -rf public/!(*.md)",
   //...
}

运行脚本时我在终端中遇到的错误

> rm -rf public/!(*.md)

sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `rm -rf public/**/!(*.md)'

失败的可能解决方案...

  1. 引用 glob rm -rf 'public/!(*.md)'
    • 这消除了错误,但脚本不会删除文件。
  2. 我还尝试用转义的双引号引用 glob 并得到相同的结果。
  3. 我尝试转义括号并收到 json 解析错误。

我觉得问题是...

我刚刚了解到 npm run 脚本不使用运行命令的用户的 shell。 我不知道如何解决这个问题,除非安装额外的 npm 包? 如果是这种情况,我应该安装哪些软件包?

在 bash 下运行你的脚本。 正如您从错误消息中看到的,即sh: ,这不是 bash。 如果脚本必须在 sh 下运行,请使用 sh-wrapper 脚本。 例如,如果您当前的 bash 脚本(包含rm或您需要做的任何事情)是foo.sh ,请将命令写为:

"clean:public": "bash /path/to/your/script/foo.sh"

遇到了同样的问题,并在del-cli包的推荐下让它工作。

npm install --save-dev del-cli

然后在 package.json

"clean:public": "del public/** '!public/*.md'"

对于那些好奇的人,可以使用--force标志在当前目录之外使用del

"clean:public": "del ../some-upper-dir/** '!../some-upper-dir/*.md' -f"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM