使用du命令获取文件夹的大小

时间:2019-06-14 14:10:38

标签: javascript node.js spawn du

我以前在电子应用中使用此代码来获取目录的大小

var util  = require('util'),
spawn = require('child_process').spawn,
size    = spawn('du', ['-sh', '/path/to/dir']);

size.stdout.on('data', function (data) {
console.log('size: ' + data);
});

它可以在我的机器上工作。当我在另一台Windows计算机上进行构建和运行时,它抛出的du不能识别为这样的内部命令...

  1. 为什么这只能在我的机器上运行,而不是其他Windows机器。
  2. 我也怀疑它是否可以在linux / mac机器上工作?
  3. 此du命令的工作方式??

否则,在所有三个平台和所有机器上,都没有通用的方法来获取目录的大小。

5 个答案:

答案 0 :(得分:2)

1。。计算机中安装的Windows可能具有sysinternals du命令。并非在所有Windows安装中都存在。您可能更喜欢使用windirstat.info或类似www.getfoldersize.com的本地语言。

2。。由于使用UNIX和Linux命令来估计文件空间使用情况,因此它可以在OS等任何UNIX系统上工作。

3。。du命令是用于报告文件系统磁盘空间使用情况的命令行实用程序。它可用于找出文件和文件夹的磁盘使用情况,并显示正在占用的空间。它支持仅显示目录或所有文件,并显示总计,以人类可读的格式输出,并且可以与其他UNIX工具结合使用,以输出系统上文件夹最大文件的排序列表。参见:https://shapeshed.com/unix-du/

如果需要它在UNIX和非UNIX OS上运行,则应首先检查程序用户使用的是哪个OS,然后根据运行它的操作系统执行另一个命令。 / p>

答案 1 :(得分:1)

du是Linux命令。它通常在Windows中不可用(不知道Mac,抱歉)

child_process模块​​提供了生成子进程的功能。看来您只是在操作系统中执行命令。因此,要使一个解决方案可以在多个系统上运行,您可以有两个选择:

  • 像现在一样,检查操作系统,并执行(使用spawn)适当的系统命令。这使代码最简单
  • 或者,使用JavaScript代码(StackOverflow中存在许多有关如何在node.js中获取目录大小的问题)。我认为这是覆盖任何操作系统而无需担心命令支持的最安全方法。

您必须在Windows系统中安装了一些linux工具,但是您不能依靠在任何常见Windows中都可以使用它们

答案 2 :(得分:1)

非常原始和同步的代码。对于产品,您必须切换到异步功能。

const path = require('path');
const fs = require('fs');

function dirsizeSync(dirname) {
    console.log(dirname);
    let size = 0;
    try {
        fs.readdirSync(dirname)
            .map(e => path.join(dirname, e))
            .map(e => {
                try {
                    return {
                        dirname: e,
                        stat: fs.statSync(e)
                    };
                } catch (ex) {
                    return null;
                }
            })
            .forEach(e => {
                if (e) {
                    if (e.stat.isDirectory()) {
                        size += dirsizeSync(e.dirname);
                    } else if (e.stat.isFile()) {
                        size += e.stat.size;
                    }
                }
            });
    } catch (ex) {}
    return size;
}

console.log(dirsizeSync('/tmp') + ' bytes');

答案 3 :(得分:1)

您可以使用内置的node.js fs程序包的stat命令...但是,如果您安装了整个驱动器,男孩会在内存中炸毁。最好坚持使用经过验证的节点外部的工具。

https://repl.it/@CodyGeisler/GetDirectorySizeV2

const { promisify } = require('util');
const watch = fs.watch;
const readdir = promisify(fs.readdir);
const stat = promisify(fs.stat);
const path = require('path');
const { resolve } = require('path');


const getDirectorySize = async function(dir) {
  try{
    const subdirs = (await readdir(dir));
    const files = await Promise.all(subdirs.map(async (subdir) => {
      const res = resolve(dir, subdir);
      const s = (await stat(res));
      return s.isDirectory() ? getDirectorySize(res) : (s.size);
    }));
    return files.reduce((a, f) => a+f, 0);
  }catch(e){
    console.debug('Failed to get file or directory.');
    console.debug(JSON.stringify(e.stack, null, 2));
    return 0;
  }
};

(async function main(){
  try{
    // Be careful if directory is large or size exceeds JavaScript `Number` type
    let size = await getDirectorySize("./testfolder/")
    console.log('size (bytes)',size);
  }catch(e){
    console.log('err',e);
  }
})();

答案 4 :(得分:0)

我知道这个问题有点老了,但是最近我发现自己正在寻找一个清晰,简短的答案,以解决问题,如果它对某人有用,那么它是否不仅消耗了几个字节。

我必须澄清,我并不是任何事情的专家,但是我喜欢学习,这就是我为寻求解决方案而学到的东西:

*/
First declare the needs of a Child Process and [execSync()][1]
"the method will not return until the child process has fully closed"
*/

此脚本是同步操作

//Declares the required module
const execSync = require('child_process').execSync;
//Declare the directory or file path
const target = "Absolute path to dir or file";
/*
Declare a variable or constant to store the data returned,
parse data to Number and multiplying by 1024 to get total 
bytes
*/
const size = parseInt(execSync(`du '${target}'`)) * 1024;
//Finally return or send to console, the variable or constant used for store data
return size;

使用exec或execSync可以在Unix系统中在终端上执行du some some路径时执行文件或命令,获取文件或目录的磁盘利用率,并再次进行绝对拍打,因此有必要进行将结果解析为整数后,execSync将获得一个缓冲区作为结果。

我使用模板字符串作为参数,以避免编写更多的代码行,因为您不必处理字符串路径中的空格问题,此方法支持这些空格。

//If executed in a terminal
du 'path to file or directory including white spaces in names'
// returns something like
125485 path to file or directory including white spaces in names

All about du command for Unix

我不会说英语,所以我使用翻译作为口译员,对语言错误我深表歉意。

All about du equivalent for Windows