Ls

ls -s 使用了錯誤的塊大小

  • March 18, 2018

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 -sLS_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 %k1024 字節塊,並且不受環境影響。-printf是 GNU 特定的。

無論如何,如今,這與文件系統塊大小無關。


¹ 在 BSD 上,$BLOCKSIZE四捨五入為 512 的倍數(BLOCKSIZE=1023相同BLOCKSIZE=512),不允許低於 512 的值

引用自:https://unix.stackexchange.com/questions/430722