du命令的用法

du命令的用法

前言

在Linux系统中,我们知道,用ls -al会显示出当前目录下的文件和文件夹信息,但这种方式显示出来的文件夹大小一般都是4096,而我们想知道的一般情况下是这个文件夹中所有文件的总大小,而4096的结果显然和我们的预期有所出入. 而要得到我们想要的结果,就需要用到du命令.因此在这里做简要介绍.

Linux下的目录大小为什么总是4096

首先我们需要了解前言中提到的问题,为什么ls -al显示出的目录大小会是4096呢, 这是因为, 在Linux系统下,一切皆文件, 因此目录也是文件,所以通过ls -al显示的目录大小并非常规意义上包含其子文件的总大小, 而是单纯指目录的大小.这一点和Windows并不一样. 那为什么是4096呢?这就要从Linux文件的存储机制说起。

文件存储在硬盘上,硬盘最小的存储单位是扇区(Sector),一般情况下,每个扇区存储512字节(0.5KB),但操作系统读取硬盘的时候,不会一个扇区一个扇区地读,这样效率太低,而是一次性连续读取多个扇区,即一次读取一个**块 (block),这种由多个扇区组成的块,是文件存取的最小单位 **,而最常见的块的大小,是4KB,即连续八个sector组成一个block。

文件数据都存储在block中,那么很显然,我们还需要一个地方存储文件的元信息。比如文件的创建者、创建日期、大小等等。这种储存文件元信息的区域叫做inode,中文译为“索引节点”。每个文件都对应一个inode。而Linux系统中,目录(directory)也是一种文件,而目录文件的结构非常简单,就是一系列目录项的列表,每个目录项,由两部分组成:所包含的文件名,以及该文件名对应的inode。一般来讲,存储这些信息一个block绰绰有余。因此目录一般大小显示为4096。

但下面这两点需要明确:

  • Linux下的目录大小并不都是4096
  • OS系统块的大小是可以修改的

du命令的常见用法

  1. du命令的含义和用处:

    NAME 
    	du - estimate file space usage
    DESCRIPTION
    	Summarize disk usage of the set of FILES, recursively for directories.
    	Mandatory arguments to long options are mandatory for short options too.
    SYNOPSIS
    	du [OPTION]... [FILE]...
    名字
    	du - 测量文件占用空间
    描述
    	能对文件以及递归地对文件夹汇总其所占用的空间。对于长选项所必需的参数对于短选项也是必需的。
    
  2. du命令常用的选项:

    -a, --all
    	write counts for all files, not just directories
    -h, --human-readable
    	print sizes in human readable format
    --si, like -h, but use powers of 1000 not 1024
    -s, --summarize
    	display only a total for each argument
    -d, --max-depth=N
    	print the total for a directory(or file, with --all) only if it is N or fewer levels below the command line argument; --max-depth=0 is the same as --summarize
    -L, --dereference
    	dereference all symbolic links
    --exclude=PATTERN
    	exclude files that match PATTERN
    PATTERNS
    	PATTERN is a shell pattern(not a regular expression). The pattern ? matches any one character, whereas * matches any string (composed of zero, one or multiple characters). For example, *.o will match any files whose name end in .o , Therefore, the command
    		du --exclude=*.o
    	will skip all files and subdirectories ending in .o(including the file .o itself)
    
  3. 关于常用命令的一些说明:

    • -a

      我们需要明确的是du在默认情况下只会显示出当前位置下所有目录的disk usage,但倘若当前目录下还有一些文件,虽然它们的大小会被归总到.目录下,但是这些文件自身的大小却不会被显示出来,如:

      [test01@x86c stencil]$ ls
      test.f90  tutorial
      [test01@x86c stencil]$ du
      0	./tutorial/test1
      292	./tutorial
      640	.
      

      可以看到,du的结果显示出了当前目录下的所有文件夹以及子文件夹的大小,文件的大小虽然参与计算,但是却不会显示在结果中。而当我们加上-a选项,则当前目录下的文件包含子文件夹中的文件也会被显示出来:

      [test01@x86c stencil]$ ls 
      test.f90  tutorial
      [test01@x86c stencil]$ du -a
      12	./test.f90
      4	./tutorial/cplus.cu
      36	./tutorial/cplus.o
      8	./tutorial/cuda_data.mod
      4	./tutorial/main.f90
      36	./tutorial/main.o
      4	./tutorial/mk.sh
      4	./tutorial/plus.cuf
      64	./tutorial/plus.o
      132	./tutorial/test
      0	./tutorial/test1
      292	./tutorial
      336	./.test.f90.un~
      640	.
      
    • -h

      加上-a之后的结果显然还不是很能让人满意,因为前面显示大小的数字让人有些不明所以,du输出的文件大小的默认单位是K,注意这里的K和KB不一样的,这一点在du的手册中有清晰的表述,原文如下:

      Units are K,M,G,T,P,E,Z,Y (powers of 1024) or KB,MB,... (powers of 1000)
      

      因此,1024 bytes = 1K , 而1000 bytes = 1KB ,我们可以通过添加--block-size =1KB的方式将单位转化为KB而非K,稍微说了一些题外话,而要结果更容易让人阅读,就可以加上-h选项,结果会自动加上合适的单位展示出来:

      [test01@x86c stencil]$ du -h
      0	./tutorial/test1
      292K	./tutorial
      640K	.
      

      --si选项则正如前面所介绍的,和-h作用相仿,仅仅将单位的进制由1024变成了1000

    • -s

      有时,我们不想知道每个文件或子文件夹的大小,只想知道当前目录的总大小。此时就可以使用-s选项,如果不额外指定要输出的内容,它默认只会输出.文件夹的大小:

      [test01@x86c stencil]$ du -sh
      640K	.
      
    • -d

      我们经常会遇到这样一种情况:想查看当前目录下所有文件及文件夹的大小,但如果我们用du -h,则只能显示出文件夹,无法显示文件,如果我们用du -ah,则虽然当前目录下的文件会被显示出来,但子文件夹下的文件也会被显示出来。前面说到的这几个选项似乎都结局不了这个问题,此时就需要用到-d选项,通过明确给出N层数,结合-a选项,就可以查看从当前目录开始计算的任意层数的所有文件的大小了。需要注意的是,0代表.文件夹,1代表..下所有文件,2代表.下所有文件及其更深一层的子文件,以此类推。因此回到前面提出的问题,想要查看当前目录下所有文件及文件夹的大小,只需要:

      du -ah -d 1
      

      即可。查看2层及以上深度的目录大小一般是不怎么常用的,而当depth=0时又和dh -sh的效果是完全一致的,因此depth=1的情况是最为常见的,有必要进行记忆。另外,长选项--max-depth=1-d 1是完全一样的效果,虽然长选项更加容易理解,在其他资料中也更常见,但个人觉得,simple is better than complex,还是短选项更加好用。

    • -L

      -L主要是应对目录下存在软链接的情况 ,我们知道,软链接事实上只是个快捷方式,并不会对当前磁盘空间大小造成什么影响,因此du命令在默认情况下是会直接忽略掉软链接的,它们甚至都不会出现在结果中,参见du(1) 中的这句话:

      -P, --no-dereference
      	don't follow any symbolic links (this is the default)
      

      因此,如果你想要查看软链接所指向的目录的大小,那么就需要显式地加入-L选项

    • --exclude=PATTERN

      如果有一些文件你不想要参与统计,那么可以通过此命令将其排除出去,PATTERN的格式在前面已经有叙述,另外还可以通过指定文件大小的上限或下限来排除文件,详见du(1)

  4. 总结

    综上所述,du的常用用法主要有以下几种:

    du -sh #查看当前目录的总大小
    du -h  #查看当前目录及其子目录的大小
    du -ah -d 1 #查看当前目录及其子目录及其子文件的大小
    

参考

Linux下为什么目录的大小总是4096

du(1) manual

posted @ 2023-02-20 17:23  yukina~  阅读(284)  评论(0编辑  收藏  举报