• Linux的磁盘系统和文件系统显示的文件大小为什么不一样(du指令和ls指令的区别)


    写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文!

    本博客全网唯一合法URL:http://www.cnblogs.com/acm-icpcer/p/8744532.html

      

      考虑如下Linux I/O代码:

    #include <stdio.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <string.h>
    #include <stdlib.h>
    #define SSIZE_MAX 2048
    
    int main (int argc, char **argv)
    {
        int  fd              = 0;
        int  fd1             = 0;
        //char str[]           = "0123456789";
        char str[10];
        str[0]='a';str[8]='b';str[9]='';
        for(fd1=1;fd1<=7;fd1++)
        {
          str[fd1]=' ';
        }
        int  len = 0;
        char buf[SSIZE_MAX];
        /*
        buf[0]='a';
        buf[10]='c';
        buf[1024]='b';
      */ fd = open("test.txt", O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR); write(fd, str, strlen(str)); write(fd, buf, SSIZE_MAX); close(fd); }

      很简单的代码:先构建输入输出流,再向指定的txt文件里面写入字符。先写入a、7个空格、b(共计9个字节);再写入2048个空字符;共计2057个字节。

      上面是还没编译运行时的情况;下面是编译运行之后的情况:

      然后使用ls命令查看发现编译运行后生成了.out的可执行文件和代码生成的输入文件test.txt,并且可以知道test.txt的文件大小就是我分析出来的,共计2057个字节。

      可以查看txt文件的内容(红色字体是linux系统下显示的空字符):

      现在我改为使用du命令去查看文件test.txt的大小,发现本应该是2057字节的,结果却变成了4.0KB:

      

    那么,为什么会出现这样的情况呢?这就要讨论一下ls和du两个命令实现的机制了:

      du == disk usage (磁盘使用量,占用的磁盘空间)
      ls == apparent sizes(文件长度,file数据结构中定义的文件长度字段)
      一个文件占用的磁盘空间和一个文件的大小是两码事情。占用磁盘空间取决于文件系统的块(block)的大小,Linux一般默认是4k(4096B) ,因此,一个大小为1个字节的文件,最小也要占用4k,如果你创建文件系统的时候制定块大小是16K,那么即便一个文件只有1个字节,占用空间也是16K。
      通常情况下,ls显示的文件大小比du显示的磁盘占用空间小,比如文件系统的block是4K,一个13K的文件占用的空间是 13k/4k = 3.25 个block,一个block只能被一个文件占用,因此实际占用空间就是4个block,就是16K。

      

    补充:

    1、ls的用法

    ls -a 列出文件下所有的文件,包括以“.“开头的隐藏文件(Linux下文件隐藏文件是以.开头的,如果存在..代表存在着父目录)。
    ls -l 列出文件的详细信息,如创建者,创建时间,文件的读写权限列表等等。
    ls -F 在每一个文件的末尾加上一个字符说明该文件的类型。"@"表示符号链接、"|"表示FIFOS、"/"表示目录、"="表示套接字。
    ls -s 在每个文件的后面打印出文件的大小。size(大小)。
    ls -t 按时间进行文件的排序  Time(时间)
    ls -A 列出除了"."和".."以外的文件。
    ls -R 将目录下所有的子目录的文件都列出来,相当于我们编程中的“递归”实现
    ls -L 列出文件的链接名。Link(链接)
    ls -S 以文件的大小进行排序

    2、du的用法

    du命令用来查看目录或文件所占用磁盘空间的大小。常用选项组合为:du -sh
    du常用的选项:
       -h:以人类可读的方式显示
      -a:显示目录占用的磁盘空间大小,还要显示其下目录和文件占用磁盘空间的大小
      -s:显示目录占用的磁盘空间大小,不要显示其下子目录和文件占用的磁盘空间大小
      -c:显示几个目录或文件占用的磁盘空间大小,还要统计它们的总和
      --apparent-size:显示目录或文件自身的大小
      -l :统计硬链接占用磁盘空间的大小
      -L:统计符号链接所指向的文件占用的磁盘空间大小  
    du -sh : 查看当前目录总共占的容量。而不单独列出各子项占用的容量
    du -lh --max-depth=1 : 查看当前目录下一级子文件和子目录占用的磁盘容量。
    du -sh * | sort -n 统计当前文件夹(目录)大小,并按文件大小排序
    du -sk filename 查看指定文件大小

    tz@COI HZAU

    2018/4/8

  • 相关阅读:
    开源的excel读取库libxls在windows下的编译,且支持中文,全网首发
    UTF8与GBK、GB2312等其他字符编码的相互转换
    深入理解Netty框架
    论一道编程面试题解法
    JVM调优总结-Xms -Xmx -Xmn -Xss
    Linux上安装jdk1.8和配置环境变量
    .NET GC垃圾回收器
    T4 模板
    Vue 环境搭建
    Spring Cloud 入门系列(一)
  • 原文地址:https://www.cnblogs.com/acm-icpcer/p/8744532.html
Copyright © 2020-2023  润新知