実際のファイルサイズが大きいのはなぜですか? [重複]

実際のファイルサイズが大きいのはなぜですか? [重複]

ASCIIテキストファイルがあります。

file foo
foo: ASCII text

6つの文字のみを含めます(「F」の後に改行やスペースなし)。

cat foo
ABCDEF

ASCIIなので、ファイルサイズは6バイトでなければなりません(ASCIIは1文字あたり1バイトです)。

ただし、du習慣的にこれを行うと、次のような混乱した結果が表示されます。

du -bsch foo
7   foo
7   total

そして

du -ksch foo
4.0K    foo
4.0K    total

そのため、予想した6bよりファイルサイズが大きいだけでなく、バ​​イト単位で書き込むときとkb単位で書き込むときにも違いがあります。

だから私の質問は

  1. ファイルサイズが予想6bより大きいのはなぜですか?余分なバイトはどこに行きましたか?
  2. duユニットごとに出力が異なるのはなぜですか?

注:これはLinuxの問題ではない可能性があります。私はUnixコマンドを使用しているので、いくつかのコンピュータサイエンスフォーラムではなく、ここにこれを投稿します。

修正する部門規模:

Disk /dev/sda: 476.94 GiB, 512110190592 bytes, 1000215216 sectors
Disk model: SanDisk SD8SN8U5
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: D12CA635-6354-48FF-A0D6-0D3CB4BDBE2E

Device         Start        End   Sectors   Size Type
/dev/sda1       2048     534527    532480   260M EFI System
/dev/sda2     534528     567295     32768    16M Microsoft reserved
/dev/sda3     567296  208748856 208181561  99.3G Microsoft basic data
/dev/sda4  208750592  210485247   1734656   847M Windows recovery environment
/dev/sda5  210485248  212582399   2097152     1G Linux filesystem
/dev/sda6  212582400 1000214527 787632128 375.6G Linux filesystem


Disk /dev/zram0: 7.65 GiB, 8210350080 bytes, 2004480 sectors
Units: sectors of 1 * 4096 = 4096 bytes
Sector size (logical/physical): 4096 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes

修正する od出力:

od -c foo
0000000   A   B   C   D   E   F  \n
0000007

答え1

Linuxの最新のファイルシステムは常に4096バイトのブロックサイズを持っています。stat -f fooこれを確認するために使用できます。

du -bblock-size=1 の見かけのサイズを教えてくれます。したがって、実際のコンテンツバイトを知らせます(疎性については知りません)。

du -k実際のディスクサイズをKiB単位で提供します。ファイルが4096より小さいので、4kを提供します。

例は次のとおりです。

du -b foo.txt 
4       foo.txt
du --block-size=1 foo.txt 
4096    foo.txt
du -b foo-5k.bin
5120    foo-5k.bin
du --block-size=1 foo-5k.bin
8192    foo-5k.bin

実際のディスクサイズはN * 4096であることがわかります。

関連情報