使用 du 命令获取文件夹的大小
Get size of folder using du command
我曾经在我的电子应用程序中使用此代码获取目录的大小
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);
});
它在我的 machine 中有效。当我在另一个 windows machine 中进行构建和 运行 时,它抛出 du is not recognized as internal command like that...
- 为什么这只在我的 machine 中有效,在其他 windows machine 中无效。
- 而且我怀疑它是否适用于 linux / mac machines ???
- 这个 du 命令是如何工作的??
或者是否有任何通用的方法来获取所有三个平台和所有 mac 操作系统中的目录大小。
du 是一个 Linux 命令。它通常在 Windows 中不可用(不知道 Mac,抱歉)
child_process 模块提供了生成子进程的能力。看起来你只是在操作系统中执行命令。因此,要获得在多个系统上运行的解决方案,您可以有两个选择:
- 正在检查操作系统,并执行(使用 spawn)适当的系统命令,就像您现在所做的那样。这使代码最简单
- 或者,使用 JavaScript 代码(Whosebug 中有许多关于如何在 node.js 中获取目录大小的问题)。我认为这是涵盖任何操作系统的最安全方式,无需担心命令支持。
您必须在 Windows 系统中安装了一些 linux 工具,但您不能指望它们在任何常见的 Windows
中可用
1. 安装在您机器上的 windows 可能有 sysinternals du command. It is not present in all windows installations. You may prefer to use windirstat.info or something more native like www.getfoldersize.com.
2. 由于 du a UNIX 和 Linux 命令用于估计文件 space 使用情况,因此它应该可以在任何 UNIX 中工作,例如 OS .
3. du 命令是一个命令行实用程序,用于报告文件系统磁盘 space 使用情况。它可用于找出文件和文件夹的磁盘使用情况,并显示占用的空间 space。它支持只显示目录或所有文件,显示总计,以人类可读的格式输出,并且可以与其他 UNIX 工具结合使用,以输出系统上最大文件夹文件的排序列表。参见:https://shapeshed.com/unix-du/
如果你需要它在 UNIX 和 non-UNIX OS 上工作,你应该首先检查你的程序的用户使用了什么 OS 然后执行不同的命令取决于它 运行 使用的操作系统。
非常原始和同步的代码。对于产品,您必须切换到异步功能。
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');
您可以使用内置的 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);
}
})();
我知道这个问题有点老了,但最近我发现自己在寻找一个关于如何做的明确而简短的答案,如果它对某人有用,那么,如果它不仅消耗了一些字节。
我必须澄清,我不是任何方面的专家,但我喜欢学习,这就是我在寻找解决方案时学到的东西:
*/
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 path',得到文件或者目录的磁盘使用率,又是绝对pat,所以是有必要对结果的整数进行解析,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
我的母语不是英语,所以我使用翻译作为口译员,对于语言错误,我深表歉意。
我曾经在我的电子应用程序中使用此代码获取目录的大小
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);
});
它在我的 machine 中有效。当我在另一个 windows machine 中进行构建和 运行 时,它抛出 du is not recognized as internal command like that...
- 为什么这只在我的 machine 中有效,在其他 windows machine 中无效。
- 而且我怀疑它是否适用于 linux / mac machines ???
- 这个 du 命令是如何工作的??
或者是否有任何通用的方法来获取所有三个平台和所有 mac 操作系统中的目录大小。
du 是一个 Linux 命令。它通常在 Windows 中不可用(不知道 Mac,抱歉)
child_process 模块提供了生成子进程的能力。看起来你只是在操作系统中执行命令。因此,要获得在多个系统上运行的解决方案,您可以有两个选择:
- 正在检查操作系统,并执行(使用 spawn)适当的系统命令,就像您现在所做的那样。这使代码最简单
- 或者,使用 JavaScript 代码(Whosebug 中有许多关于如何在 node.js 中获取目录大小的问题)。我认为这是涵盖任何操作系统的最安全方式,无需担心命令支持。
您必须在 Windows 系统中安装了一些 linux 工具,但您不能指望它们在任何常见的 Windows
中可用1. 安装在您机器上的 windows 可能有 sysinternals du command. It is not present in all windows installations. You may prefer to use windirstat.info or something more native like www.getfoldersize.com.
2. 由于 du a UNIX 和 Linux 命令用于估计文件 space 使用情况,因此它应该可以在任何 UNIX 中工作,例如 OS .
3. du 命令是一个命令行实用程序,用于报告文件系统磁盘 space 使用情况。它可用于找出文件和文件夹的磁盘使用情况,并显示占用的空间 space。它支持只显示目录或所有文件,显示总计,以人类可读的格式输出,并且可以与其他 UNIX 工具结合使用,以输出系统上最大文件夹文件的排序列表。参见:https://shapeshed.com/unix-du/
如果你需要它在 UNIX 和 non-UNIX OS 上工作,你应该首先检查你的程序的用户使用了什么 OS 然后执行不同的命令取决于它 运行 使用的操作系统。
非常原始和同步的代码。对于产品,您必须切换到异步功能。
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');
您可以使用内置的 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);
}
})();
我知道这个问题有点老了,但最近我发现自己在寻找一个关于如何做的明确而简短的答案,如果它对某人有用,那么,如果它不仅消耗了一些字节。
我必须澄清,我不是任何方面的专家,但我喜欢学习,这就是我在寻找解决方案时学到的东西:
*/
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 path',得到文件或者目录的磁盘使用率,又是绝对pat,所以是有必要对结果的整数进行解析,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
我的母语不是英语,所以我使用翻译作为口译员,对于语言错误,我深表歉意。