ls -s 使用了錯誤的塊大小
Ubuntu linux:ls -s與****du & stat不同意小文件使用的塊數。
ls -s ../nc2/.git/logs/refs/heads/ total 4 du ../nc2/.git/logs/refs/heads/ 8 ../nc2/.git/logs/refs/heads/ stat ../nc2/.git/logs/refs/heads/ File: ‘../nc2/.git/logs/refs/heads/’ Size: 4096 Blocks: 8 IO Block: 4096 ...... sudo blockdev --getbsz /dev/sda 4096
ls -s 使用 4 個塊顯示文件。du & size 說它使用 8 個塊。
為什麼 ls -s 看似錯誤?它不能檢測到正確的塊大小嗎?我可以通過執行“ls -s –block-size 512”來說明文件使用了 8 個塊。
這不是文件大小與塊數的問題。上面的所有命令都是列出塊大小而不是文件大小。
編輯:請求更多資訊:
ls --version ls (GNU coreutils) 8.21 type ls ls is aliased to `ls --color=auto' LS_BLOCK_SIZE=512 ls -s ../nc2/.git/logs/refs/heads/ total 8
ls -s
報告/系統呼叫st_blocks
返回的結構的成員。那是一個 512 字節的塊。512 字節通常是與早期磁碟扇區相對應的最小儲存粒度。stat()``lstat()
或者至少這是大多數
ls
實現所做的,包括原始的 Unix 實現,以及 POSIX 所要求的。然而,GNU 實現
ls
(也busybox
模仿它,兩者都在 Ubuntu 上找到)將其更改為 1024 字節塊,但如果$POSIXLY_CORRECT
(以前$POSIX_ME_HARDER
)變數在環境中(不適用於busybox),則返回到 512 字節塊。我想這是為了讓它對人類更具可讀性,但這意味著我們在使用 512 字節儲存粒度且無助於可移植性的文件系統上失去了精度。從變更日誌:
1991 年 8 月 21 日星期三 13:03:14 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)
- 3.0 版。
- du.c, ls.c:將 1K 塊設為預設大小,-ka 無操作。降低愚蠢的標準!
使用 GNU
ls
(不是busybox),也可以使用--block-size
選項或$LS_BLOCK_SIZE
環境變數指定塊大小。因此,您可以使用ls --block-size=1 -s
或LS_BLOCK_SIZE=1 ls -s
以字節為單位獲取磁碟使用情況。其他ls
實現,如 BSD 上的使用$BLOCKSIZE
¹(也$BLOCK_SIZE
被 GNU辨識,ls
如@yahol 所示)。POSIXly,您可以使用
-k
以千字節為單位獲取計數(謝天謝地,GNU 或 BSDls
優先於$BLOCKSIZE
環境變數)。可移植(如果你想考慮busybox
ls
,千比字節的報告是硬編碼的),要回到st_blocks
(或至少是它的近似值),你需要類似的東西:blocks=$(ls -skd -- "$file" | awk '{print $1*2; exit}')
使用 GNU
find
,-printf %b
報告多個 512 字節塊和-printf %k
1024 字節塊,並且不受環境影響。-printf
是 GNU 特定的。無論如何,如今,這與文件系統塊大小無關。
¹ 在 BSD 上,
$BLOCKSIZE
四捨五入為 512 的倍數(BLOCKSIZE=1023
相同BLOCKSIZE=512
),不允許低於 512 的值