我正在某个大型目录上执行常规的du
。由于存储也是通过网络连接的,因此可能需要很长时间。
我希望在流程结束之前看到进度,以便我可以估计正在发生的事情。在任何给定的时间,我都希望看到du
所计算的磁盘使用量总和。我找不到du
提供此选项的选项。我错过了什么?有一个简单的方法可以做到这一点吗?
我想像这样:
du -ba . | { s=0; while read a b; do ((s+=a)); echo $s; done; }
这将汇总输出,但是当然这还将汇总累积的目录大小(有效地乘以计数的大小)。我发现没有选择只在输出中提及 files 。另一方面,使用find -type f -printf "%s %p\n"
会多次计算硬链接。
是否有任何典型的工具可以实现我想要的功能或对所呈现脚本的简单修复?目前,我考虑为此编写Python脚本,但感觉可能有些过头了。
答案 0 :(得分:1)
我想出了一个小巧的衬里来解决我的问题。它不像正确使用du
那样好,但是它提供了进度信息,并且没有两次计算硬链接。
我在这里一行给出并扩展以使其更加清晰:
find -type f -printf "%s %i %p\n" | { sum=0; declare -A inodes; while read size inode path; do [ "${inodes[$inode]}" != 1 ] && { inodes[$inode]=1; ((sum+=size)); echo "$sum $size $path"; }; done; }
格式相同:
find -type f -printf "%s %i %p\n" | {
sum=0
declare -A inodes
while read size inode path
do
[ "${inodes[$inode]}" != 1 ] && {
inodes[$inode]=1
((sum+=size))
echo "$sum $size $path"
}
done
}
答案 1 :(得分:0)
Maybe below command give you a hint to progress ahead
ls -laR | awk '{ total += $6;if(FNR%1000 == 0)print total;}; END { print total }'
In the awk statement, you can various condition to check if it is a directory or links.
And FNR%1000
will print the size progress every hundred line it reads. Instead of ls
, you can use find
答案 2 :(得分:0)
我认为,为了从du
实用程序的性能与任何自定义脚本的性能中获利,可以这样做:
tar -xf coreutils-8.30.tar.xz && cd coreutils-8.30
./configure --prefix=/custom/location/of/modified/coreutils
./src/du.c
的{{1}}行后添加语句666
print_size (&tot_dui, _("total"));
函数的结尾如下:
process_file
if ((IS_DIR_TYPE (info) && level <= max_depth)
|| (opt_all && level <= max_depth)
|| level == 0)
{
/* Print or elide this entry according to the --threshold option. */
uintmax_t v = opt_inodes ? dui_to_print.inodes : dui_to_print.size;
if (opt_threshold < 0
? v <= -opt_threshold
: v >= opt_threshold)
print_size (&dui_to_print, file);
print_size (&tot_dui, _("total")); /* extra statement */
}
return ok;
这将使修改后的make install
能够在每个文件之后报告总大小,即输出结果如下:
du
答案 3 :(得分:0)
如果您可以下载它,ncdu
是一个不错的程序,与du一样,但是界面很好,包括您的进度。