linux 获取磁盘空间大小

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指针当前位置。(也就是偏离文件首字符个数)

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <stdlib.h>  //exit(0);
 
int main()
{
     FILE *fp =NULL;
     long n = 0 ;
 
     if ((fp = fopen( "Q.txt" , "r" )) == NULL)
     {
         printf( "文件打开失败.\n" );
         exit( 0 );
     }
     fseek(fp, 0 , 2 );   //指针:移动到文件尾部
     n = ftell(fp);   //返回指针偏离文件头的位置(即文件中字符个数)
 
     printf( "%ld\n" ,n);
 
     return 0 ;
}</stdlib.h></stdio.h>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值