- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我写了一小段代码,使用 nftw 系统调用来进行树行走。
int flags =0;
flags = flags | FTW_MOUNT;
int nopenfd = 10;
if( nftw( argv[1], sum_sizes, nopenfd, flags) == -1 )
return EXIT_FAILURE;
使用此选项,nftw 不会扫描目录(如果它是挂载点)并取消引用符号链接(symbolic link)(默认行为)。
在每个文件 nftw 上调用这个函数:
/*total_size is the sum of each file/directory/link*/
long long int total_size, total_real_size = 0;
static int sum_sizes(const char *pathname, const struct stat *statbuf, int typeflag, struct FTW *ftwbuf)
{
/*if stat failed on the current file*/
if(typeflag == FTW_NS)
{
printf("No stats (permissions ?) on %s", pathname);
return 0;
}
total_size = total_size + (long long int ) statbuf->st_size;
total_real_size = total_real_size + (long long int ) ( statbuf->st_blocks * 512 );
return 0;
}
所以最后,我显示累积大小:
printf("total size: %lld (%0.2lf K %0.2lf M)\n", total_size, (float)total_size /1024.0, (float)total_size /(1024.0*1024.0));
printf("total real size: %lld (%0.2lf K %0.2lf M)\n", total_real_size, (float)total_real_size /1024.0, (float)total_real_size /(1024.0*1024.0));
当我将值与 du 进行比较时,我发现有一些差异
time ./scan_dir ~/
====>
total size: 15208413390 (14851966.00 K 14503.87 M)
total real size: 15708553216 (15340384.00 K 14980.84 M)
block size : 4096 / fond. block size : 4096
fs size: 22.7895 G
./scan_dir ~/ 0,03s user 0,24s system 98% cpu 0,277 total
time du -s ~/
15119876 /home/cedlemo/
du -s ~/ 0,07s user 0,22s system 98% cpu 0,287 total
注意:阅读 du 的手册页后,我知道 du 的行为与我的小应用程序 scan_dir 几乎相同(跳过挂载点,取消引用符号链接(symbolic link)并使用 1024 以计算 Ko 中的值)
似乎在我的应用程序中找到的更接近的值是实际大小(使用的 block )的总和,但该值并不完全相同。
造成这种差异的原因可能是什么?我做错了什么?
最佳答案
默认情况下,du
不 遵循符号链接(symbolic link)。您的代码可以。
du -ks DIRECTORY/
相当于
find DIRECTORY/ -printf '%k\n' | awk '{s+=$1} END { printf "%.0f\n", s }'
它只查看每个目录条目一次,不遵循符号链接(symbolic link),不跨越挂载点,并输出 st_blocks*2
的总和(即以 1024 字节为单位)。换句话说,分配给文件和目录内容的 1024 字节单元的数量 -- 磁盘使用情况。
另一方面,逻辑文件和目录大小的总和是
find DIRECTORY/ -printf '%s\n' | awk '{s+=$1} END { printf "%.0f\n", s / 1024.0 }'
这与磁盘使用无关,仅与存储在文件和目录中的表观信息量有关。通常这种测量仅限于常规文件,即
find DIRECTORY/ -type f -printf '%s\n' | awk '{s+=$1} END { printf "%.0f\n", s / 1024.0 }'
所以它基本上告诉用户,如果他们将所有文件连接成一个大文件,他们将获得多大的文件。它是否有意义还有待商榷,但许多用户认为它提供了很多信息。无论如何,这绝对是对磁盘使用情况的不同衡量。
在文件统计中(参见 man 2 fstat
),st_blocks
描述了为文件内容分配了多少个 512 字节单元,而 st_size
是文件的逻辑大小文件。
大多数文件系统都支持稀疏文件。这意味着当您使用 truncate()
放大文件时,或者通过写入比当前文件大小更高的文件偏移量,文件系统根本不存储跳过的部分。但是,阅读该部分是完全可以的;它总是读作全零。因此,一个巨大的文件可能只消耗几个 block ,如果它大部分是零。 (准确地说,“跳过零”。创建文件时,仅写入零不会生成稀疏文件。您的应用程序需要跳过写入零,以生成稀疏文件。)
由于某些文件系统上的某些文件使用了间接 block , block 的数量也可能大于根据文件大小假设的 block 数。可能会分配和说明“额外的 block ”,因为文件是碎片化的或其他特殊的。在所有典型的文件系统上,无论如何,分配的 block 数都会四舍五入为文件系统分配大小的倍数。
在您的情况下,总大小
是文件的逻辑长度,如果您要将所有文件和目录的内容连接到一个文件中,包括符号链接(symbolic link)引用的任何重复项。
在您的情况下,总实际大小
描述了为所有文件和目录分配的磁盘空间总量,如果符号链接(symbolic link)被替换为原始文件的副本。
如果你改成
flags = FTW_MOUNT | FTW_PHYS;
你应该得到匹配 du -s
的 total real size
。
关于c - nftw 目录的总大小与 du 输出不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18936326/
我正在使用 OUTFILE 命令,但由于权限问题和安全风险,我想将 shell 的输出转储到文件中,但出现了一些错误。我试过的 #This is a simple shell to connect t
我刚刚开始学习 Java,我想克服在尝试为这个“问题”创建 Java 程序时出现的障碍。这是我必须创建一个程序来解决的问题: Tandy 喜欢分发糖果,但只有 n 颗糖果。对于她给第 i 个糖果的人,
你好,我想知道我是否可以得到一些帮助来解决我在 C++ 中打印出 vector 内容的问题 我试图以特定顺序在一个或两个函数调用中输出一个类的所有变量。但是我在遍历 vector 时收到一个奇怪的错误
我正在将 intellij (2019.1.1) 用于 java gradle (5.4.1) 项目,并使用 lombok (1.18.6) 来自动生成代码。 Intellij 将生成的源放在 out
编辑:在与 guest271314 交流后,我意识到问题的措辞(在我的问题正文中)可能具有误导性。我保留了旧版本并更好地改写了新版本 背景: 从远程服务器获取 JSON 时,响应 header 包含一
我的问题可能有点令人困惑。我遇到的问题是我正在使用来自 Java 的 StoredProcedureCall 调用过程,例如: StoredProcedureCall call = new Store
在我使用的一些IDL中,我注意到在方法中标记返回值有2个约定-[in, out]和[out, retval]。 当存在多个返回值时,似乎使用了[in, out],例如: HRESULT MyMetho
当我查看 gar -h 的帮助输出时,它告诉我: [...] gar: supported targets: elf64-x86-64 elf32-i386 a.out-i386-linux [...
我想循环遍历一个列表,并以 HTML 格式打印其中的一部分,以代码格式打印其中的一部分。所以更准确地说:我想产生与这相同的输出 1 is a great number 2 is a great
我有下面的tekton管道,并尝试在Google Cloud上运行。集群角色绑定。集群角色。该服务帐户具有以下权限。。例外。不确定需要为服务帐户设置什么权限。
当尝试从 make 过滤非常长的输出以获取特定警告或错误消息时,第一个想法是这样的: $ make | grep -i 'warning: someone set up us the bomb' 然而
我正在创建一个抽象工具类,该类对另一组外部类(不受我控制)进行操作。外部类在某些接口(interface)点概念上相似,但访问它们相似属性的语法不同。它们还具有不同的语法来应用工具操作的结果。我创建了
这个问题已经有答案了: What do numbers starting with 0 mean in python? (9 个回答) 已关闭 7 年前。 在我的代码中使用按位与运算符 (&) 时,我
我写了这段代码来解析输入文件中的行输入格式:电影 ID 可以有多个条目,所以我们应该计算平均值输出:**没有重复(这是问题所在) import re f = open("ratings2.txt",
我需要处理超过 1000 万个光谱数据集。数据结构如下:大约有 1000 个 .fits(.fits 是某种数据存储格式)文件,每个文件包含大约 600-1000 个光谱,其中每个光谱中有大约 450
我编写了一个简单的 C 程序,它读取一个文件并生成一个包含每个单词及其出现频率的表格。 该程序有效,我已经能够在 Linux 上运行的终端中获得显示的输出,但是,我不确定如何获得生成的显示以生成包含词
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
1.普通的输出: print(str)#str是任意一个字符串,数字··· 2.格式化输出: ?
我无法让 logstash 正常工作。 Basic logstash Example作品。但后来我与 Advanced Pipeline Example 作斗争.也许这也可能是 Elasticsear
这是我想要做的: 我想让用户给我的程序一些声音数据(通过麦克风输入),然后保持 250 毫秒,然后通过扬声器输出。 我已经使用 Java Sound API 做到了这一点。问题是它有点慢。从发出声音到
我是一名优秀的程序员,十分优秀!