ls -sは無効なブロックサイズを使用します。

ls -sは無効なブロックサイズを使用します。

Ubuntu Linux:LS-S同意しない&統計資料~のためブロック数小さなファイルに使用されます。

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

ベストアンサー1

ls -sレポート/システム呼び出しst_blocksによって返された構造体メンバー。これは512バイトブロックです。 512バイトは初期ディスクセクタに対応するため、通常は最小ストレージ単位です。stat()lstat()

あるいは、少なくともls元のUnix実装とPOSIXが必要とするものを含むほとんどの実装が行うことです。

ただし、GNU実装ls(Ubuntuで見つかったエミュレーション)はこれを1024バイトのチャンクに変更しますがbusybox(以前)変数が環境にある場合(busyboxでは機能しません)、512バイトのチャンクに置き換えられます。これは人間が読みやすくするためのものだと思いますが、これは512バイトのストレージユニットを使用するファイルシステムの精度を失い、移植性に役立たないことを意味します。$POSIXLY_CORRECT$POSIX_ME_HARDER

変更ログから:

Wed Aug 21 13:03:14 1991 David J. MacKenzie (djm at wookumz.gnu.ai.mit.edu)

  • バージョン3.0。

  • du.c、ls.c:1Kブロックをデフォルトサイズに設定し、-kaは機能しません。愚かな基準はもうやめて!

GNU(busyboxではない)の場合は、オプションまたは環境変数lsでブロックサイズを指定できます。したがって、またはを使用して、ディスク使用量をバイト単位で取得できます。この機能(GNUでも認識されています)の他の実装(例:BSDの実装)は、次のように認識されます。--block-size$LS_BLOCK_SIZEls --block-size=1 -sLS_BLOCK_SIZE=1 ls -sls$BLOCKSIZE$BLOCK_SIZEls@yaholが表示しました)。

POSIXlyでは、これを使用して-kキロバイト単位で数を取得できます(幸い、GNUまたはBSDは環境変数lsよりも優先されます)。$BLOCKSIZE

移植可能に(KB単位のレポートがハードコードされているbusyboxを考慮したい場合ls)、返すst_blocks(または少なくともおおよその値)には、次のものが必要です。

blocks=$(ls -skd -- "$file" | awk '{print $1*2; exit}')

GNUを使用すると、find環境に関係なく、多くの-printf %b512バイトチャンクと-printf %k1024バイトチャンクが報告されます。-printfGNU専用です。

とにかく、これはファイルシステムのブロックサイズとは何の関係もありません。


1 BSDでは512(同じ)$BLOCKSIZEの倍数に丸められ、512未満の値は許可されません。BLOCKSIZE=1023BLOCKSIZE=512

おすすめ記事