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_SIZE
ls --block-size=1 -s
LS_BLOCK_SIZE=1 ls -s
ls
$BLOCKSIZE
$BLOCK_SIZE
ls
@yaholが表示しました)。
POSIXlyでは、これを使用して-k
キロバイト単位で数を取得できます(幸い、GNUまたはBSDは環境変数ls
よりも優先されます)。$BLOCKSIZE
移植可能に(KB単位のレポートがハードコードされているbusyboxを考慮したい場合ls
)、返すst_blocks
(または少なくともおおよその値)には、次のものが必要です。
blocks=$(ls -skd -- "$file" | awk '{print $1*2; exit}')
GNUを使用すると、find
環境に関係なく、多くの-printf %b
512バイトチャンクと-printf %k
1024バイトチャンクが報告されます。-printf
GNU専用です。
とにかく、これはファイルシステムのブロックサイズとは何の関係もありません。
1 BSDでは512(同じ)$BLOCKSIZE
の倍数に丸められ、512未満の値は許可されません。BLOCKSIZE=1023
BLOCKSIZE=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.