如何从Node.js Spawn调用“ find -exec”

时间:2018-07-28 07:06:50

标签: node.js find spawn

我有一个遗留的perl应用程序发布脚本,我正试图在nodejs中重写它。

发布过程的一部分涉及在子文件夹中的所有文件上设置正确的属性。

在perl发行脚本中,这是使用反引号完成的,就像这样...

my $command = `find '$code_folder' -type f -exec chmod 644 {} +`;

这很好。

尽管将其翻译为可在节点上使用,但我遇到了问题。

我正尝试使用“生成” npm模块,就像这样...

const chalk = require("chalk"),
    spawn = require('child_process').spawn;

let childProcess = spawn('find',['test_folder','-type','f','-exec chmod 644 {} +'],{});

childProcess.stdout.on('data', function (data) {
    console.log(chalk.green(data.toString()));
});

childProcess.stderr.on('data', function (data) {
    console.log(chalk.red(data.toString()));
});

childProcess.on('close', (code) => {
    if (code === 0) {
        console.log(chalk.blue(`exit_code = ${code}`));
    }
    else {
        console.log(chalk.yellow(`exit_code = ${code}`));
    }
});

childProcess.on('error', (error) => {
    console.log(chalk.red(error.toString()));
});

当我尝试运行此命令时,出现以下错误...

  

查找:未知谓词`-exec chmod 644 {} +'

如果我省略了-exec部分,该命令将按预期运行并显示所有文件。

我已经尽力想尽一切办法以不同的方式对其进行转义,但是找不到找到使其接受“ -exec”参数的方法。

另外,我应该提到,我也尝试了以下方法...

let childProcess = spawn('find',['test_folder','-type','f','-exec','chmod 644 {} +'],{});

它给出了错误...

  

查找:`-exec'缺少参数

更新: 我找到了一种方法。不过似乎有点seems。如果有人知道正确的方法,请告诉我。

以下作品...

let childProcess = spawn('sh',['-c', 'find test_folder -type f -exec chmod 644 {} +'],{});

因此,它不是生成“ find”进程,而是生成“ sh -c”,然后将“ find”命令作为自变量传递给它。

2 个答案:

答案 0 :(得分:2)

找到所有文件后,您可以使用fs module更改权限。我正在使用节点10,因此,如果您之前使用的是任何东西,则可能需要稍微更改语法。

const { chmodSync } = require('fs')
const {execFileSync} = require('child_process')

execFileSync('find',['test_folder', '-type', 'f'])
 .toString() // change from buffer to string
 .trim() //remove the new line at end of the file
 .split('\n') // each file found as array element
 .forEach(path => chmodSync(path, '644')) // Set chmod to 644

答案 1 :(得分:2)

如果要使用spawn方法,则必须将每个参数作为单独的数组元素传递,如下所示:

const spawn = require('child_process').spawn;

const childProcess = spawn(
   'find',
   ['test_folder', '-type', 'f', '-exec', 'chmod', '644', '{}', '+'],
   {}
);

但是我建议使用exec方法。对于您的用例,它们应该相同,但是exec具有更好的界面。它接受整个命令作为字符串,并返回缓冲的响应,因此您无需手动管理流。这是一个示例:

const exec = require('child_process').exec;

exec('find test_folder -type f -exec chmod 644 {} +', (error, stdout, stderr) => {
   console.log(error, stdout, stderr);
});