Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 获取目录大小和磁盘大小的最快方法_Windows_Linux_Bash - Fatal编程技术网

Windows 获取目录大小和磁盘大小的最快方法

Windows 获取目录大小和磁盘大小的最快方法,windows,linux,bash,Windows,Linux,Bash,我最近遇到了一个类似的问题,但我现在想做的是使用bash模拟Windows“目录-->右键单击-->属性”函数(见图) 我可以使用以下命令以字节为单位复制类似于大小:的内容: echo $(find . -type f -printf "%s+") | sed 's/+$//g' | bc 这是相当快,但有可能获得信息更快(比查找)或做数学更快(比bc)? 此外,我将使用du-sb命令模拟磁盘上的大小:,可能还有两个find来计算文件和目录,并模拟Contains:行 有更好的方法来模拟这些

我最近遇到了一个类似的问题,但我现在想做的是使用bash模拟Windows“目录-->右键单击-->属性”函数(见图)

我可以使用以下命令以字节为单位复制类似于大小:的内容:

echo $(find . -type f -printf "%s+") | sed 's/+$//g' | bc
这是相当快,但有可能获得信息更快(比查找)或做数学更快(比bc)? 此外,我将使用
du-sb
命令模拟磁盘上的大小:,可能还有两个
find
来计算文件和目录,并模拟Contains:

有更好的方法来模拟这些结果吗?

假设cygwin:

cd /cygdrive/c

printf "Size: %s", $( du --apparent-size -sh )
printf "Size on disk: %s", $( du  -sh )
find . -printf "%y\n" | awk '
  $1 == "d" {dirs++} 
  END {printf("Contains: %d files, %d folders\n", NR-dirs, dirs)}
'

我刚刚基于写了一个快速而肮脏的实用程序

该实用程序基本上只是manpage示例,添加了一些统计信息

功能的 我选择了

  • 保持在一个挂载点内
  • 不遵循符号链接(为简单起见,因为它通常是您想要的)
  • 请注意,它仍然会计算符号链接本身的大小:)
  • 它显示外观大小(文件的长度)以及磁盘上的大小(分配的块)
测试,速度 我在我的盒子上测试了二进制文件(/tmp/test):

# clear page, dentry and attribute caches
echo 3> /proc/sys/vm/drop_caches 
time /tmp/test /
输出

总尺寸:28433001733
在878794个文件和87047个目录中(73318个符号链接和0个不可访问的目录)
磁盘上的大小59942192*512b=30690402304
实0m2.066s
用户0.140s
sys 0m1.910s
我没有和你的工具相比,但它看起来确实很快。也许您可以获取源代码并构建自己的版本以获得最高速度

要测试稀疏文件的报告是否正确:

mkdir sparse
dd bs=1M seek=1024 count=0 of=sparse/file.raw
ls -l sparse/
./test sparse/
输出:

总计0
-rw-r--r--1 sehe sehe 1073741824 2011-09-23 22:59 file.raw
总尺寸:1073741884
在1个文件和1个目录中(0个符号链接和0个不可访问的目录)
磁盘上的大小0*512b=0
代码
非常喜欢使用
find
awk
来获取文件和目录计数(+1!),但我不确定
--表观大小
选项。这是Windows返回的吗?从
du
手册页中,我不确定这是否是我的意思:确切的目录大小。关于文件/目录计数:指向目录的符号链接?您将把它们计为文件(始终)。也许它们实际上是文件……如果您将静态全局计数器放在一个名称空间中,并将它们标记为“thread_local”,那么您可以使用您的方法作为获取磁盘大小信息的线程安全方式。
#define _XOPEN_SOURCE 500
#include <ftw.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

static uintmax_t total        = 0ul;
static uintmax_t files        = 0ul;
static uintmax_t directories  = 0ul;
static uintmax_t symlinks     = 0ul;
static uintmax_t inaccessible = 0ul;
static uintmax_t blocks512    = 0ul;

static int
display_info(const char *fpath, const struct stat *sb,
             int tflag, struct FTW *ftwbuf)
{
    switch(tflag)
    {
        case FTW_D:
        case FTW_DP:  directories++;  break;
        case FTW_NS:
        case FTW_SL:
        case FTW_SLN: symlinks++;     break;
        case FTW_DNR: inaccessible++; break;
        case FTW_F:   files++;        break;
    }
    total += sb->st_size;
    blocks512 += sb->st_blocks;
    return 0; /* To tell nftw() to continue */
}

int
main(int argc, char *argv[])
{
    int flags = FTW_DEPTH | FTW_MOUNT | FTW_PHYS;

    if (nftw((argc < 2) ? "." : argv[1], display_info, 20, flags) == -1)
    {
        perror("nftw");
        exit(EXIT_FAILURE);
    }

    printf("Total size: %7jd\n", total);
    printf("In %jd files and %jd directories (%jd symlinks and %jd inaccessible directories)\n", files, directories, symlinks, inaccessible);
    printf("Size on disk %jd * 512b = %jd\n", blocks512, blocks512<<9);

    exit(EXIT_SUCCESS);
}
gcc test.c -o test