linux 獲取磁碟空間大小

shuilaner_發表於2017-03-22

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);
 
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>

相關文章