首页 > 解决方案 > 如何在nodejs中使用日期制作.tar.gz?

问题描述

请帮助我理解。如何在命令中适应文件夹和存档文件的路径?我想像在 Linux 中一样在存档中添加一个日期,例如 (date +% y-% m-% d)。

const { exec } = require("child_process");

let date = new Date();
var cmd = `'cd /root/mikrotik_weekly_backup/'+ ' '+ 'tar -zxfc router.tar.gz'+'${date}' '/root/mikrotik_weekly_backup'`;

My Output: error: Command failed: 'cd /root/mikrotik_weekly_backup/'+' '+'tar -zxfc router.tar.gz'+'Thu Apr 08 2021 16:10:42 GMT+0300 (Eastern European Summer Time)' /root/mikrotik_weekly_backup
/bin/sh: 1: cd /root/mikrotik_weekly_backup/+ +tar -zxfc router.tar.gz+Thu Apr 08 2021 16:10:42 GMT+0300 (Eastern European Summer Time): not found

标签: javascriptnode.js

解决方案


一些东西:

  1. 不要cd在正在运行的命令中使用,而是使用(和其他人)接受的cwd选项。exec
  2. 据我所知,您尝试创建的字符串会/root/mikrotik_weekly_backup在写入文件时尝试备份/root/mikrotik_weekly_backup,这似乎并不理想。
  3. 尝试使用带有空格且没有转义的字符串附加到文件名是行不通的,因为空格(在命令行中)会分隔参数;在任何情况下,来自对象的默认字符串Date都会导致冗长且有问题的文件名。
  4. 不要尝试构建命令行字符串。相反,使用spawn这样您就可以单独传递每个参数,而不必担心

大致:

const { spawn } = require("child_process");

const date = [
    date.getFullYear(),
    date.getMonth() + 1,
    date.getDate(),
    date.getHours(),
    date.getMinutes(),
    date.getSeconds(),
].map(x => String(x).padStart(2, "0")).join("-");
// Or just `const 
const child = spawn(
    // Command
    "tar",
    // Arguments
    ["-zxfc", `router-${date}.tar.gz`, "path/to/what/you/want/backed/up"],
    // `spawn` options
    {
        cwd: "/root/mikrotik_weekly_backup"
    }
);
child.on("close", code => {
    // ...look at `code` to see what happened...
});

推荐阅读