代码之家  ›  专栏  ›  技术社区  ›  Kent

stat命令如何计算文件的块?

  •  14
  • Kent  · 技术社区  · 16 年前

    我想知道如何 stat 命令计算文件的块数。我读过这个 article 上面写着:

    值st_blocks给出了512字节块中的文件大小。(这可能小于st_size/512,例如当文件有漏洞时。)值st_blksize给出了高效文件系统I/O的“首选”块大小。(以较小的块写入文件可能会导致低效的读取-修改-重写。)

    命令 dumpe2fs -h /dev/sda3

    ...
    First block: 0
    Block size: 4096
    Fragment size: 4096
    ...
    

    然后我跑

    kent@KentT60:~/Desktop$ stat Email
    File: `Email'
    Size: 965 Blocks: 8 IO Block: 4096 regular file
    Device: 80ah/2058d Inode: 746095 Links: 1
    Access: (0644/-rw-r--r--) Uid: ( 1000/ kent) Gid: ( 1000/ kent)
    Access: 2009-08-11 21:36:36.000000000 +0200
    Modify: 2009-08-11 21:36:35.000000000 +0200
    Change: 2009-08-11 21:36:35.000000000 +0200
    

    如果文件系统获取了文件 Email

    kent@KentT60:~/Desktop$ stat wxPython-demo-2.8.10.1.tar.bz2
    File: `wxPython-demo-2.8.10.1.tar.bz2'
    Size: 3605257 Blocks: 7056 IO Block: 4096 regular file
    Device: 80ah/2058d Inode: 746210 Links: 1
    Access: (0644/-rw-r--r--) Uid: ( 1000/ kent) Gid: ( 1000/ kent)
    Access: 2009-08-12 21:45:45.000000000 +0200
    Modify: 2009-08-12 21:43:46.000000000 +0200
    Change: 2009-08-12 21:43:46.000000000 +0200
    
    
    3605257/512=7041.xx = 7042
    

    状态 结果显示7056。

    另一个例子来自互联网 https://www.computerhope.com/unix/stat.htm 。我将示例粘贴在页面底部:

    File: `index.htm'
    Size: 17137 Blocks: 40 IO Block: 8192 regular file
    Device: 8h/8d Inode: 23161443 Links: 1
    Access: (0644/-rw-r--r--) Uid: (17433/comphope) Gid: ( 32/ www)
    Access: 2007-04-03 09:20:18.000000000 -0600
    Modify: 2007-04-01 23:13:05.000000000 -0600
    Change: 2007-04-02 16:36:21.000000000 -0600
    

    有人能解释一下吗 状态 计算“块”值?

    谢谢!

    2 回复  |  直到 5 年前
        1
  •  17
  •   Barry Kelly    16 年前

    stat 命令行工具使用 状态 / fstat 等函数,它们在 状态 st_blocks 状态

    磁盘上实际分配的512字节大小的物理块总数。此字段不是为块特殊或字符特殊文件定义的。

    同样,对于wxPython示例,它表示在磁盘上物理分配了7056*512字节,即3612672字节。你明白了。

    IO块大小是“关于I/O操作的‘最佳’单元大小的提示”-它通常是物理磁盘上的分配单位。不要混淆IO块和 状态 用于表示物理尺寸;物理大小的块总是512字节。

    就像我说的, st_blocks

    $ echo foo > test
    $ stat test
      Size: 4               Blocks: 2          IO Block: 512    regular file
    (irrelevant details omitted)
    

    $ dd if=/dev/zero of=test2 bs=8192 count=4
    $ stat test2
      Size: 32768           Blocks: 65         IO Block: 32768  regular file
    

    test3 测试3 编辑器中的文件:

    $ cp test2 test3
    $ joe -hex test3
    $ stat test3
      Size: 4               Blocks: 65         IO Block: 32768  regular file
    

    test -但由于ZFS文件系统分配空间的方式,它在磁盘上实际使用了32.5K。块大小随着文件变大而增加,但当文件变小时不会减小。(是的,这可能会导致大量浪费空间,具体取决于您在ZFS上执行的文件类型和文件操作,这就是为什么它允许您在每个文件系统的基础上设置最大块大小,并动态更改它。)

        2
  •  0
  •   santhosh    7 年前

    我不是在谈论像ZFS这样的复杂FS


    -stat输出字段“块”显示不存在的虚拟块的数量(每个512字节)。即stat从“大小”字段中给出文件大小,除以512并将其放入答案中。 \

    举个例子。

    # od -t x1 ./1
    0000000 31 0a
    0000002
    

    文件系统格式化为fs块大小4K 让我们看看统计数据

    # stat 1
      File: 1
      Size: 2           Blocks: 8          IO Block: 4096   regular file
    Device: 811h/2065d  Inode: 12          Links: 1
    

    让我们再取一个块大小为1K fs的ext2 fs。

    # stat 1
      File: 1
      Size: 2           Blocks: 2          IO Block: 1024   regular file
    

    IO块=1024,这正是fs块大小。(1K)

    文件不能占用小于1K的磁盘量。因此2字节占用1K磁盘大小。

    这正是我们所看到的

    Blocks: 2