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

答え2

info coreutils Block sizeこれは(私が方法を見つけた場所)で説明されていますinfo ls

2.3 Block size

(...)The block size used for display is independent of
any file system block size.(...)

‘DF_BLOCK_SIZE’
     This specifies the default block size for the ‘df’ command.
     Similarly, ‘DU_BLOCK_SIZE’ specifies the default for ‘du’ and
     ‘LS_BLOCK_SIZE’ for ‘ls’.

これらの各プログラムは、環境変数で定義されている異なるブロックサイズを使用できるようです。

次の2つのenv変数は、出力を統合するのに役立ちます。

‘BLOCK_SIZE’
     This specifies the default block size for all three commands, if
     the above command-specific environment variables are not set.

‘BLOCKSIZE’
     This specifies the default block size for all values that are
     normally printed as blocks, if neither ‘BLOCK_SIZE’ nor the above
     command-specific environment variables are set.  Unlike the other
     environment variables, ‘BLOCKSIZE’ does not affect values that are
     normally printed as byte counts, e.g., the file sizes contained in
     ‘ls -l’ output.

これは512ブロックのデフォルト値を説明します。

‘POSIXLY_CORRECT’
     If neither ‘COMMAND_BLOCK_SIZE’, nor ‘BLOCK_SIZE’, nor ‘BLOCKSIZE’
     is set, but this variable is set, the block size defaults to 512.

関連情報