如何使用花括号通过“ shelljs”在单个命令中创建多个目录?

时间:2019-05-17 10:30:47

标签: javascript node.js bash ubuntu-18.04 shelljs

如果您在Linux终端中运行此命令:

mkdir -p ./dist/{articles,scripts,stylesheets}

它将在当前目录中创建以下文件夹树:

dist
|- articles
|- scripts
|- stylesheets

当我尝试使用shelljs npm软件包进行相同操作时,会发生问题。

例如,调用以下函数:

shell.mkdir("-p", "./dist/{articles,scripts,stylesheets}");

结果将创建以下文件树:

dist
|- {articles,scripts,stylesheets}

换句话说,这是一个名为dist的文件夹,其中包含一个名为{articles,scripts,stylesheets}的子文件夹。

我已经尝试过将花括号转义,就像这样:

shell.mkdir("-p", "./dist/\{articles,scripts,stylesheets\}");

它没有用,所以我加倍努力并逃脱了反斜杠:

shell.mkdir("-p", "./dist/\\{articles,scripts,stylesheets\\}");

那也不起作用,所以我再次加倍并在转义的反斜杠之前添加了转义的反斜杠:

shell.mkdir("-p", "./dist/\\\\{articles,scripts,stylesheets\\\\}");

什么都不起作用,但是确实创建了一个具有不同名称的文件夹:

\\{articles,scripts,stylesheets\\}

如何解决此问题?

2 个答案:

答案 0 :(得分:4)

正确的方法是使用循环或类似方法重写括号扩展:

const shell = require('shelljs')
for(var dir of ["articles", "scripts", "stylesheets"]) {
  shelljs.mkdir("-p", "./dist/" + dir)
}

这是快速,强大和便携式的。

等效地,您可以使用third party library来为您展开它们:

const shell = require('shelljs')
const braces = require('braces')
shell.mkdir("-p", braces("./dist/{articles,scripts,stylesheets}", {expand: true}))

字面意义上的方法是显式调用Bash,因为括号扩展是bash的功能:

shelljs.exec("bash -c 'mkdir -p ./dist/{articles,scripts,stylesheets}'")

这是缓慢,易碎且不可移植的,因为它需要两次调用两个Unix shell并进行两个相应的转义级别。

shelljs的要点是将这些代码替换为纯JS实现,以便它需要零壳的零调用,因此这完全违背了首先使用它的目的。

答案 1 :(得分:0)

shelljs mkdir()命令将列表或目录名称数组作为参数。正如我们在source代码中看到的那样,它将不会尝试执行 bash 提供的任何命令或序列构建器实用程序。因此,没有必要尝试逃避括号。

相反,您可以使用exec()发送原始命令:

shell.exec("bash -c 'mkdir -p ./dist/{articles,scripts,stylesheets}'")