首页 > 解决方案 > 是否可以检查在 exec 中运行的 shell 命令中是否存在文件夹?

问题描述

我正在尝试使用 exec 在节点中创建一个单行器。这个想法是创建一个名为admin的文件夹并将解压缩文件解压缩到其中,因此:

mkdir admin
tar xvfz release.tar.gz -C admin/

问题是,有时admin存在(没关系,我想覆盖它的内容),并且使用 exec 会触发错误:

exec('mkdir admin && tar xvfz release.tar.gz -C admin/', (err, stdout, stderr) => {
  if(err) { //mkdir fails when the folder exist }
});

如果 mkdir 失败,有没有办法优雅地继续?理想情况下,我想像 rm -rf admin/ 这样清理 admin 的内容,以便新的 untar 重新开始,但话又说回来,该命令将失败。

PS:我知道我可以在午餐执行之前与 FS 一起检查文件夹,但我对多合一执行解决方案感兴趣。(如果可能的话)

编辑:问题How to mkdir only if a dir 不存在?类似,但仅是关于 mkdir 的具体使用,而是关于连接和错误传播。

标签: node.js

解决方案


您不需要mkdir在现有目标上失败,您可以使用该--parents标志:

-p, --parents
no error if existing, make parent directories as needed

将您的 oneliner 变成:

exec('mkdir -p admin && tar xvfz release.tar.gz -C admin/', (err, stdout, stderr) => {
  // continue
});

或者,您也可以使用;而不是&&链接将始终继续的调用,无论退出代码如何:

exec('mkdir admin; tar xvfz release.tar.gz -C admin/', (err, stdout, stderr) => {
  // continue
});

推荐阅读