我操作 Synology NAS 设备,该设备包含 600 多个用户数据。
用户备份数据为税务会计数据。因此,大约一个用户的文件夹有 200,000 个文件。
我必须向每个用户提供他们的备份数据使用信息,但是由于目录和文件du太多,命令执行时间太长。
有人可以为我提供一种以更快的方式检查每个用户的磁盘使用情况的方法吗?
我试图du -ch在多个目录上运行,但我只是分开它只显示所有文件的总大小(我不想要每个单独的文件,然后是最后的总数是什么-c).
我有 18.03.1-ce 版本的 docker 支持命令 docker system df。他的输出:
Images space usage:\n\nREPOSITORY TAG IMAGE ID CREATED ago SIZE SHARED SIZE UNIQUE SiZE CONTAINERS\nregistry.gitlab.com/precisesale/app latest b7833546c2cf About an hour ago ago 252.1MB 123.8MB 128.4MB 1\nhealthdiary/app latest 565c6d3906e6 2 days ago ago 312.2MB 123.8MB 188.4MB 1\nmongo latest f93ff881751f 5 days ago ago 367.6MB 0B 367.6MB 2\nnginx latest b175e7467d66 6 weeks ago ago 108.9MB 0B 108.9MB 1\njwilder/docker-gen latest 8959ee34c769 2 months ago ago 19.91MB 4.148MB 15.77MB 1\njrcs/letsencrypt-nginx-proxy-companion latest 17939ceb7a52 2 months ago …Run Code Online (Sandbox Code Playgroud) 我正在使用du -sh查看目录的大小。如果我检查一个 1KB 的目录,我会看到:
1.0K .
Run Code Online (Sandbox Code Playgroud)
但是,我想要以字节为单位的输出,并且只需要字节数。
例如:
$ du -sh .
1024
Run Code Online (Sandbox Code Playgroud) 请看下面对不同方式的一些测试比较的原始问题:
所以我到目前为止尝试了两种方法:
1.使用Windows命令行中的获取文件夹大小中的代码遍历目录:
@echo off
set size=0
for /r %%x in (folder\*) do set /a size+=%%~zx
echo %size% Bytes
Run Code Online (Sandbox Code Playgroud)
2.保存输出
'dir %folder% /s /a'
Run Code Online (Sandbox Code Playgroud)
进入文本文件,然后读入底部的大小
我现在尝试的最后一种方法是使用du(来自MS的磁盘实用工具 - https://technet.microsoft.com/en-us/sysinternals/bb896651.aspx).
现在除#3外,这两种方式似乎都太慢了我所需要的(数以千计的文件).所以问题是哪一个是最快的/应该是最快的,如果有任何其他快速(呃)方法来获得具有100k +文件的文件夹内容的大小(并且有100个文件夹)
下面是我非常hacky做比较的方法(屠宰我的程序看到一些输出)
有一些小错误,一些部分,如选项3将失败,因为它试图处理大于32位限制的数字,我是确定还有一些问题,但我认为一般的时间是明显的,除非我真的搞砸了我的逻辑.
选项I:遍历目录,使用VB脚本读取'dir'的文本输出并查找最后的大小+将其转换为MB(最初从其他地方获得它,我实际上失去了我得到它的地方选项II:迭代,使用findstr管道并直接输出结果(不转换为MB) - 来自@MC ND选项III:使用compact命令迭代 - 来自@npocmaka选项IV:来自@ user1016274 - 使用robocoby
(还有一些答案,但这些是我能够融入的答案)
这些是我得到的结果,它们相互之间非常一致,robocopy将它们吹走了
选项I和选项II通常都很接近,选项II稍微好一点(两者都在1分10秒到2分10秒之间,不确定差异来自哪里)第III部分 - 16-17分钟第IV部分 - 10-20秒
@echo OFF
setlocal enabledelayedexpansion
REM OPTION I - directory iteration
REM OPTION II - iteration with findstr pipe
REM OPTION III - compact
:MAIN
REM Initialize log filename …Run Code Online (Sandbox Code Playgroud) 如果问题的措辞有误,请告诉我.这可能解释了为什么我找不到答案.
我想使用如下命令在主磁盘上找到用法:
du -sh /*
Run Code Online (Sandbox Code Playgroud)
问题是我在根级别有多个挂载点,我想du跳过这些.
我认为-x应该选择这样做,但要么我误解了它的作用,要么我错误地使用它.
如何du在不遍历其他安装的情况下仅应用于根磁盘?
谢谢
这令人难以置信.使用以下代码:
Process du = new Process();
string cmdPath = System.IO.Path.Combine(Environment.SystemDirectory, "du.exe");
Debug.WriteLine(cmdPath);
ProcessStartInfo info = new ProcessStartInfo(cmdPath);
info.CreateNoWindow = true;
info.Arguments = arguments;
info.UseShellExecute = false;
info.RedirectStandardOutput = true;
du.StartInfo = info;
du.EnableRaisingEvents = true;
du.OutputDataReceived += responseParser;
du.Start();
du.BeginOutputReadLine();
du.WaitForExit();
Run Code Online (Sandbox Code Playgroud)
我跑了,我得到:
未处理的异常:System.ComponentModel.Win32Exception:系统找不到指定的文件
虽然cmdPath的输出值是C:\Windows\system32\du.exe!
当然,如果我只是输入cmdPath命令提示符的内容,它运行du.exe并给我使用信息.
此外,如果我用"du.exe"替换命令路径,并将du.exe放在工作目录中,一切正常.但我想引用系统位置中的那个.
那么发生了什么?据我所知,我有一个合法的文件说明符,但为什么不Process.Start()执行呢?这个基本代码也执行其他几个程序并获得它们的输出.其他都工作正常,虽然du.exe与它们不同,因为它位于system32目录中.这与它有关吗?
谢谢
首先,我是一个 bash 菜鸟,所以请温柔点:)
我试图总结位于不同位置但具有相同名称的文件夹的大小。它看起来像这样:
root
--- directory 1
------ folder 1
--------subfolder 1
--------subfolder 2
------ folder 2
--------subfolder 3
--------subfolder 4
------ folder 3
--------subfolder 5
--------subfolder 6
--- directory 2
------ folder 1
--------subfolder 1
--------subfolder 2
------ folder 2
--------subfolder 3
--------subfolder 4
------ folder 3
--------subfolder 5
--------subfolder 6
Run Code Online (Sandbox Code Playgroud)
我正在尝试对子目录 1 到 6 的大小求和并将其输出到 .csv
目前,我只是在两个单独的 CSV 文件中输出子目录的大小。一份用于目录 1,一份用于目录 2
目前,我可以输出我在需要的地方运行的子文件夹的大小:
du -h --max-depth=1 --block-size=GB * | grep "[\/]" | sort -n -r > ~/lists/disks/RC_job.csv
Run Code Online (Sandbox Code Playgroud)
输出如下所示: …
我们需要监视目录的大小(例如InfluxDB的数据目录)以在Grafana中设置警报.如上所述:如何配置telegraf将文件夹大小发送到InfluxDB,没有内置的插件.
我们不介意使用inputs.execTelegraf 的部分.目录不是很大(低文件数+ dircount),所以深度扫描(如使用du)对我们来说很好.
我们需要监控的目录之一是/var/lib/influxdb/data.
什么是一个简单的脚本来执行,有什么警告?
我经常在没有-h标志的unix盒子上工作.
我正在寻找一个单行转换KB转换为人类可读.Perl似乎是个不错的选择.
这就是我到目前为止所拥有的.
@a=split /\s+/;
$x=$_!=0?int(log()/log(1024)):0;
@b=('K','M','G');
printf("%.3s%s\t%s\n",$_/(1024)**$x,$b[$x],$a[1]);
Run Code Online (Sandbox Code Playgroud)
像这样运行:
du -ks * | perl -lne '@a=split /\s+/;$x=$_!=0?int(log()/log(1024)):0;@b=('K','M','G');printf("%.3s%s\t%s\n",$_/(1024)**$x,$b[$x],$a[1]);'
Run Code Online (Sandbox Code Playgroud)
它无法正常工作,因为我无法找到正确的printf格式.
使用perl以及awk/sed等的单行将是最有用的.
这就是du -h的样子.最大1位小数.最小值:0位小数.随着舍入.
8.0K
1.7M
4.0M
5.7M
88K
Run Code Online (Sandbox Code Playgroud)
更新:
du -ks * | perl -lane '$F[0];$x=$_!=?int(log()/log(1024)):0;printf("%.3s%s\t%s\n",$_/1024**$x,qw<K M G>[$x],$F[1]);'
Run Code Online (Sandbox Code Playgroud)