Linuxでファイルの物理サイズを取得する方法は?


12

を使用ls -lしてファイルの論理サイズを取得できますが、ファイルの物理サイズを取得する方法はありますか?


「物理的」サイズであなたの意味を定義してください。
イェルクWミッターク

回答:


28

ls -lファイルの見かけのサイズがわかります。これは、プログラムがファイルを最初から最後まで読み取った場合にプログラムが読み取るバイト数です。 du「ディスク上の」ファイルのサイズがわかります。

デフォルトでduは、ファイルのサイズをディスクブロック数で示しますが、-h代わりに人間が読める単位を使用することもできます。duシステムのマニュアルも参照してください。

GNU coreutil du(おそらくLinux上にあるもの)では、 -bバイトを取得することは--apparent-sizeオプションを意味することに注意してください。これは、実際にディスクで使用されているバイト数を取得するために使用するものではありません。代わりに、--block-size=1またはを使用してください-B 1

GNU lsではls -s --block-size=1、ファイルに対しても実行できます。これによりdu -B 1、ファイルと同じ番号が与えられます。


例:

$ ls -l file
-rw-r--r--  1 myself wheel  536870912 Apr  8 11:44 file

$ ls -lh file
-rw-r--r--  1 myself wheel   512M Apr  8 11:44 file

$ du -h file
24K    file

$ du -B 1 file
24576   file

$ ls -s --block-size=1 file
24576 file

これは、これがディスク上で約24 KBを必要とする512 MBファイルであることを意味します。これはスパースファイルです(ほとんどの場合、実際にはディスクに書き込まれず、ファイル内の論理的な「穴」として表されるゼロ)。スパースファイルは、事前に割り当てられた大きなファイル(仮想マシンのディスクイメージやスワップファイルなど)で作業する場合によく見られます。スパースファイルの作成は高速ですが、ゼロで埋めるのは遅い(そして不要です)。

fallocateLinuxシステムのマニュアルも参照してください。


この場合、この違いは重要ですか?あなたは実用的な例を作ることができますか?前もって感謝します。
D'Arcy Nader

1
@ D'ArcyNader更新された回答を参照してください。
クサラナンダ

誤解があれば訂正してください。ただし、最初の文はその逆です。stackoverflow.com / a / 31437673/3701431duは、実際に読み取ることができるデータ量をls示し、ディスクセクターが割り当てられている範囲を示します。
Sergiy Kolodyazhnyy

2
@SergiyKolodyazhnyy(返信が遅くなって申し訳ありません)いいえ、duファイルが実際に使用しているディスクの量を示します。一方、によって示される見かけのサイズ(論理サイズ)lsは、プログラムがファイルから読み取ることができるバイト数です。ファイルがスパースの場合、読み取られたバイトの一部はゼロになりますが、それらは(ディスクからではなく)それらを読み取るプログラムに配信されます。
クサラナンダ

これは本当に良い答えでした。
Lizardx

3

私はこのようにファイルサイズをバイト単位で取得します:

actualsize=$(du -b "${file}" | cut -f 1)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.