du和ls查看文件大小的區別
du == disk usage (磁盤使用量,
占用的磁盤空間)
du 的基本使用
du -s #s參數是可以統計占硬盤空間大小的
如 du -skh web
-k或--kilobytes 以1024 bytes為單位。
-h或--human-readable 以K,M,G為單位,提高信息的可讀性
-s或--summarize 統計目錄或文件
一個文件占用的磁盤空間和一個文件的大小是兩碼事情。占用空間取決於文件系統的塊(block)的大小,linux一般默認是4k(4096) ,因此,一個大小為1個字節的文件,最小也要占用4k,如果你創建文件系統的時候制定塊大小是16K,那么即便一個文件只有1個字節,占用空間也是16K。
如果一個分區上主要放大文件,那么block可以大一些,有利於減少磁盤碎片,如果主要放小文件,那么block設置小一下,否則太浪費磁盤空間。
通常情況下, ls 顯示的文件大小比du顯示的磁盤占用空間小
原因:
比如文件系統的block是4K,一個13K的文件占用的空間是 13k/4k = 3.25 個block,一個block只能被一個文件占用,因此實際占用空間就是4個block,就是16K。
如果一個文件有比較大的黑洞,那么會出現文件大小比磁盤空間占用大的情況
原因:
首先要理解什么是黑洞,怎么才能產生黑洞?(以下來自《UNIX 環境高級編程》)
在向一個文件中寫數據的時候,文件偏移量可以大於文件的當前長度,在這種情況下,對該文件的下一次寫將加長該文件,並在文件中構成一個空洞,這一定是允許的。位於文件中但沒有寫過的字節都被讀為0.
文件中的空洞並不要求在磁盤上占用存儲區。具體處理方式與文件系統的實現有關,當定位超出文件尾端之后寫時,對於新寫的數據需要分配磁盤塊,但是對於原文件尾端和新開始寫位置之間的部分則不需要分配磁盤塊。
du 的基本使用
du -s #s參數是可以統計占硬盤空間大小的
如 du -skh web
-k或--kilobytes 以1024 bytes為單位。
-h或--human-readable 以K,M,G為單位,提高信息的可讀性
-s或--summarize 統計目錄或文件
一個文件占用的磁盤空間和一個文件的大小是兩碼事情。占用空間取決於文件系統的塊(block)的大小,linux一般默認是4k(4096) ,因此,一個大小為1個字節的文件,最小也要占用4k,如果你創建文件系統的時候制定塊大小是16K,那么即便一個文件只有1個字節,占用空間也是16K。
如果一個分區上主要放大文件,那么block可以大一些,有利於減少磁盤碎片,如果主要放小文件,那么block設置小一下,否則太浪費磁盤空間。
通常情況下, ls 顯示的文件大小比du顯示的磁盤占用空間小
原因:
比如文件系統的block是4K,一個13K的文件占用的空間是 13k/4k = 3.25 個block,一個block只能被一個文件占用,因此實際占用空間就是4個block,就是16K。
如果一個文件有比較大的黑洞,那么會出現文件大小比磁盤空間占用大的情況
原因:
首先要理解什么是黑洞,怎么才能產生黑洞?(以下來自《UNIX 環境高級編程》)
在向一個文件中寫數據的時候,文件偏移量可以大於文件的當前長度,在這種情況下,對該文件的下一次寫將加長該文件,並在文件中構成一個空洞,這一定是允許的。位於文件中但沒有寫過的字節都被讀為0.
文件中的空洞並不要求在磁盤上占用存儲區。具體處理方式與文件系統的實現有關,當定位超出文件尾端之后寫時,對於新寫的數據需要分配磁盤塊,但是對於原文件尾端和新開始寫位置之間的部分則不需要分配磁盤塊。
例如:用dd if=/dev/zero of=a.out seek=1023 bs=1M count=1創建a.out文件后,用ls查看a.out的文件大小為1G,用du查看a.out文件大小為1M。
生成黑洞文件的示例代碼temp.c:
#include
#include
#include
#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
char buf1[] = "abcdefghij";
char buf2[] = "ABCDEFGHIJ";
void err_sys(char *msg){
printf("%s", msg);
exit(0);
}
int main(void){
int fd;
if((fd = creat("file.hole", FILE_MODE)) < 0)
err_sys("creat error");
if(write(fd, buf1, 10) != 10)
err_sys("buf1 write error");
if(lseek(fd, 16384, SEEK_SET) == -1)
err_sys("lseek error");
if(write(fd, buf2, 10) != 10)
err_sys("buf2 write error");
exit(0);
}
$gcc temp.c
$./a.out
$od -c file.hole
0000000 a b c d e f g h i j \0 \0 \0 \0 \0 \0
0000020 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
*
0040000 A B C D E F G H I J
0040012
$du -sh file.hole
8.0K file.hole
$ls -al
drwxr-xr-x 2 root root 4096 Apr 15 20:20 .
drwxr-xr-x 8 root root 4096 Mar 20 13:22 ..
-rwxr-xr-x 1 root root 5598 Apr 15 20:20 a.out
-rw-r--r-- 1 root root 16394 Apr 15 20:20 file.hole
-rw-r--r-- 1 root root 718 Apr 15 20:20 temp.c