现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

linux 获取磁盘空间大小

2016-07-27 22:00 工业·编程 ⁄ 共 7926字 ⁄ 字号 暂无评论

1.查看文件大小

查看当前文件夹下所有文件大小(包括子文件夹)

   du -sh

# du -h

15M     ./package

16K     ./.fontconfig

4.0K    ./.cache

5.1M    ./.rpmdb

20M     .

查看指定文件夹下所有文件大小(包括子文件夹)

# du -h ftp

3.8G    ftp/sanya/doc

3.8G    ftp/sanya

4.0K    ftp/testftp/doc

1.4M    ftp/testftp

875M    ftp/platform/doc/002-录像

27M     ftp/platform/doc/001-PDF

5.2M    ftp/platform/doc/BBFlash

1.2G    ftp/platform/doc/003-录音

2.1G    ftp/platform/doc

2.1G    ftp/platform

4.0K    ftp/pmo/doc

20K     ftp/pmo

36M     ftp/uf/doc/innovate-201207

36M     ftp/uf/doc

36M     ftp/uf

446M    ftp/code/doc

446M    ftp/code

6.3G    ftp

查看指定文件大小

# du -h ./package/compat-libstdc++-33-3.2.3-69.el6.x86_64.rpm

184K    ./package/compat-libstdc++-33-3.2.3-69.el6.x86_64.rpm

查看指定文件夹大小

# du -hs ftp

6.3G    ftp

用法:du [选项]... [文件]...

或:du [选项]... --files0-from=F

计算每个文件的磁盘用量,目录则取总用量。

长选项必须使用的参数对于短选项时也是必需使用的。

  -a, --all  输出所有文件的磁盘用量,不仅仅是目录

      --apparent-size 显示表面用量,而并非是磁盘用量;虽然表面用量通常会

   小一些,但有时它会因为稀疏文件间的"洞"、内部碎

   片、非直接引用的块等原因而变大。

  -B, --block-size=大小 使用指定字节数的块

  -b, --bytes  等于--apparent-size --block-size=1

  -c, --total  显示总计信息

  -D, --dereference-args 解除命令行中列出的符号连接

      --files0-from=F 计算文件F 中以NUL 结尾的文件名对应占用的磁盘空间

   如果F 的值是"-",则从标准输入读入文件名

  -H   等于--dereference-args (-D)

  -h, --human-readable 以可读性较好的方式显示尺寸(例如:1K 234M 2G)

      --si  类似-h,但在计算时使用1000 为基底而非1024

  -k   等于--block-size=1K

  -l, --count-links 如果是硬连接,就多次计算其尺寸

  -m   等于--block-size=1M

  -L, --dereference 找出任何符号链接指示的真正目的地

  -P, --no-dereference 不跟随任何符号链接(默认)

  -0, --null  将每个空行视作0 字节而非换行符

  -S, --separate-dirs 不包括子目录的占用量

  -s, --summarize 只分别计算命令列中每个参数所占的总用量

  -x, --one-file-system  跳过处于不同文件系统之上的目录

  -X, --exclude-from=文件 排除与指定文件中描述的模式相符的文件

      --exclude=PATTERN  排除与PATTERN 中描述的模式相符的文件

      --max-depth=N 显示目录总计(与--all 一起使用计算文件)

   当N 为指定数值时计算深度为N;

   --max-depth=0 等于--summarize

      --time  显示目录或该目录子目录下所有文件的最后修改时间

      --time=WORD 显示WORD 时间,而非修改时间:

   atime,access,use,ctime 或status

      --time-style=样式 按照指定样式显示时间(样式解释规则同"date"命令):

   full-iso,long-iso,iso,+FORMAT

      --help  显示此帮助信息并退出

      --version  显示版本信息并退出

[大小]可以是以下的单位(单位前可加上整数):

kB 1000,K 1024,MB 1000000,M 1048576,还有 G、T、P、E、Z、Y。

请向报告du 的错误

GNU coreutils 项目主页:<http://www.gnu.org/software/coreutils/>

GNU 软件一般性帮助:<http://www.gnu.org/gethelp/>

请向<http://translationproject.org/team/zh_CN.html> 报告du 的翻译错误

2.Ubuntu 查看磁盘空间大小命令

df -h Df命令是linux系统以磁盘分区为单位查看文件系统,可以加上参数查看磁盘剩余空间信息,命令格式: df -hl 显示格式为: 文件系统 容量 已用 可用 已用% 挂载点 Filesystem Size Used Avail Use% Mounted on /dev/hda2 45G 19G 24G 44% / /dev/hda1 494

df   -h

Df命令是linux系统以磁盘分区为单位查看文件系统,可以加上参数查看磁盘剩余空间信息,命令格式:

df -hl

显示格式为:

文件系统              容量 已用 可用 已用% 挂载点

Filesystem            Size Used Avail Use% Mounted on

/dev/hda2              45G   19G   24G 44% /

/dev/hda1             494M   19M 450M   4% /boot

/dev/hda6             4.9G 2.2G 2.5G 47% /home

/dev/hda5             9.7G 2.9G 6.4G 31% /opt

none                 1009M     0 1009M   0% /dev/shm

/dev/hda3             9.7G 7.2G 2.1G 78% /usr/local

/dev/hdb2              75G   75G     0 100% /

/dev/hdb2              75G   75G     0 100% /

以上面的输出为例,表示的意思为:

HD硬盘接口的第二个硬盘(b),第二个分区(2),容量是75G,用了75G,可用是0,因此利用率是100%, 被挂载到根分区目录上(/)。

下面是相关命令的解释:

df -hl 查看磁盘剩余空间

df -h 查看每个根路径的分区大小

du -sh [目录名] 返回该目录的大小

du -sm [文件夹] 返回该文件夹总M数

更多功能可以输入一下命令查看:

df --help

du --help

(责任编辑:admin)

3.statfs:

#include <sys/vfs.h>    /* 或者 <sys/statfs.h> */

int statfs(const char *path, struct statfs *buf);

int fstatfs(int fd, struct statfs *buf);

参数:  

path: 位于需要查询信息的文件系统的文件路径名(不是设备名,是挂载点名称)。    

fd: 位于需要查询信息的文件系统的文件描述词。

buf:以下结构体的指针变量,用于储存文件系统相关的信息

struct statfs

{

   long    f_type;     /* 文件系统类型  */

   long    f_bsize;    /* 经过优化的传输块大小  */

   long    f_blocks;   /* 文件系统数据块总数 */

   long    f_bfree;    /* 可用块数 */

   long    f_bavail;   /* 非超级用户可获取的块数 */

   long    f_files;    /* 文件结点总数 */

   long    f_ffree;    /* 可用文件结点数 */

   fsid_t  f_fsid;     /* 文件系统标识 */

   long    f_namelen;  /* 文件名的最大长度 */

};

***************************************************************

返回说明:  

成功执行时,返回0。失败返回-1,errno被设为以下的某个值  

EACCES: (statfs())文件或路径名中包含的目录不可访问

EBADF : (fstatfs()) 文件描述词无效

EFAULT: 内存地址无效

EINTR : 操作由信号中断

EIO    : 读写出错

ELOOP : (statfs())解释路径名过程中存在太多的符号连接

ENAMETOOLONG:(statfs()) 路径名太长

ENOENT:(statfs()) 文件不存在

ENOMEM: 核心内存不足

ENOSYS: 文件系统不支持调用

ENOTDIR:(statfs())路径名中当作目录的组件并非目录

EOVERFLOW:信息溢出

**********************************************************************

相关的文件系统类型有:

      ADFS_SUPER_MAGIC      0xadf5

      AFFS_SUPER_MAGIC      0xADFF

      BEFS_SUPER_MAGIC      0x42465331

   BFS_MAGIC             0x1BADFACE

   CIFS_MAGIC_NUMBER     0xFF534D42

   CODA_SUPER_MAGIC      0x73757245

      COH_SUPER_MAGIC       0x012FF7B7

   CRAMFS_MAGIC          0x28cd3d45

      DEVFS_SUPER_MAGIC     0x1373

      EFS_SUPER_MAGIC       0x00414A53

   EXT_SUPER_MAGIC       0x137D

   EXT2_OLD_SUPER_MAGIC 0xEF51

   EXT2_SUPER_MAGIC      0xEF53

   EXT3_SUPER_MAGIC      0xEF53

   HFS_SUPER_MAGIC       0x4244

   HPFS_SUPER_MAGIC      0xF995E849

   HUGETLBFS_MAGIC       0x958458f6

   ISOFS_SUPER_MAGIC     0x9660

   JFFS2_SUPER_MAGIC     0x72b6

   JFS_SUPER_MAGIC       0x3153464a

      MINIX_SUPER_MAGIC     0x137F /* orig. minix */

   MINIX_SUPER_MAGIC2    0x138F /* 30 char minix */

   MINIX2_SUPER_MAGIC    0x2468 /* minix V2 */

      MINIX2_SUPER_MAGIC2   0x2478 /* minix V2, 30 char names */

   MSDOS_SUPER_MAGIC     0x4d44

   NCP_SUPER_MAGIC       0x564c

   NFS_SUPER_MAGIC       0x6969

   NTFS_SB_MAGIC         0x5346544e

   OPENPROM_SUPER_MAGIC 0x9fa1

     PROC_SUPER_MAGIC      0x9fa0

   QNX4_SUPER_MAGIC      0x002f

      REISERFS_SUPER_MAGIC 0x52654973

   ROMFS_MAGIC           0x7275

   SMB_SUPER_MAGIC       0x517B

   SYSV2_SUPER_MAGIC     0x012FF7B6

   SYSV4_SUPER_MAGIC     0x012FF7B5

      TMPFS_MAGIC           0x01021994

   UDF_SUPER_MAGIC       0x15013346

   UFS_MAGIC             0x00011954

    USBDEVICE_SUPER_MAGIC 0x9fa2

   VXFS_SUPER_MAGIC      0xa501FCF5

   XENIX_SUPER_MAGIC     0x012FF7B4

   XFS_SUPER_MAGIC       0x58465342

   _XIAFS_SUPER_MAGIC    0x012FD16D

**********************************************************************

statfs结构中可用空间块数有两种f_bfree和 f_bavail,前者是硬盘所有剩余空间,后

者为非root用户剩余空间,ext3文件系统给root用户分有5%的独享空间,所以这里是不

同的地方。这里要强调的是每块的大小一般是4K(×这句话错误,不一定都是4k,正确做法是:总大小= sfs.f_blocks×f_bsize,即块数×每块的大小,单位是bytes,也就是要/1024/1024/1024才是GB单位,另外要注意的问题是sfs.f_blocks×f_bsize数据过大溢出,可以sfs.f_blocks/1024×f_bsize/1024=MB单位)。因此,要实现与df结果一致的就得在

获得块数上乘以4,这样已用、可用、总块数就可以实现。如果还要实现百分比一致,

那么要注意的是,df命令获得是整数百分比,没有小数,这里使用的进一法,而不是四

舍五入法。所以在程序里直接+1取整。

                   disk_size = sfs.f_blocks/1024*sfs.f_bsize/1024;//MB总大小

                   avilable =sfs.f_bavail/1024*sfs.f_bsize/1024;//MB可以空间大小

                   double all=sfs.f_blocks - sfs.f_bfree + sfs.f_bavail;

                   if(0!=all)

                   percent = (sfs.f_blocks - sfs.f_bfree ) * 100 / all + 1;可用百分比

下面是实现的一个例子:(home目录为一个独立分区)

#include <stdio.h>

#include <sys/vfs.h>

int main()

{

    struct statfs sfs;

    int i = statfs("/home", &sfs);

    int percent = (sfs.f_blocks - sfs.f_bfree ) * 100 / (sfs.f_blocks -

sfs.f_bfree + sfs.f_bavail) + 1;

    printf("/dev/sda11            %ld    %ld  %ld   %d%% /home/n",

                           4*sfs. f_blocks, 4*(sfs.f_blocks - sfs.f_bfree),

    4*sfs.f_bavail, percent);

    system("df /home ");

    return 0;

}

执行结果:

leave@LEAVE:~/test$ gcc -o df df.c

leave@LEAVE:~/test$ ./df

/dev/sda11            42773008    540356  40059864   2% /home

文件系统           1K-块        已用     可用 已用% 挂载点

/dev/sda11            42773008    540356  40059864   2% /home

leave@LEAVE:~/test$

/home/work $ df

Filesystem           1k-blocks      Used Available Use% Mounted on

/dev/mmc1                19444      9804      9640  50% /boot

/dev/mmc2                11678        78     11600   1% /setting

/dev/mmc5               160730    126767     25665  83% /home

/dev/mmc6              1758860     35492   1634020   2% /storage

/dev/sdb1            312568828  42536564 270032264  14% /c2-media/usb/USB2

4.获得文件大小需要用到2个函数:fseek() , ftell()

fseek()函数:

原型:intfseek(FILE *stream, long offset, int fromwhere);

参数:

stream: 第一个参数stream为文件指针

offset : 第二个参数offset为偏移量,正数表示正向偏移,负数表示负向偏移

  fromwhere: 第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CUR、 SEEK_END 或 SEEK_SET

SEEK_SET: 文件开头

SEEK_CUR: 当前位置

SEEK_END: 文件结尾

   其中SEEK_SET,SEEK_CUR和SEEK_END依次为0,1和2.

简言之:

fseek(fp,100L,0);把文件内部指针移动到离文件开头100字节处;

fseek(fp,100L,1);把文件内部指针移动到离文件当前位置100字节处;

fseek(fp,-100L,2);把文件内部指针退回到离文件结尾100字节处。

参考文章:百度百科,fseek(),http://baike.baidu.com/view/656696.htm

ftell()函数:

原型: longftell(FILE *stream);

功能:返回当前文件位置,也就是说返回FILE指针当前位置。(也就是偏离文件首字符个数)

#include <stdio.h>

#include <stdlib.h>  //exit(0);

intmain()

{

FILE *fp =NULL;

longn = 0;

if((fp = fopen("Q.txt","r")) == NULL)

{

printf("文件打开失败.\n");

exit(0);

}

fseek(fp,0,2);  //指针:移动到文件尾部

n = ftell(fp);   //返回指针偏离文件头的位置(即文件中字符个数)

printf("%ld\n",n);

return0;

}</stdlib.h></stdio.h>

给我留言

留言无头像?