AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 684873
Accepted
Colin Jack
Colin Jack
Asked: 2022-01-04 12:57:48 +0800 CST2022-01-04 12:57:48 +0800 CST 2022-01-04 12:57:48 +0800 CST

ls -ls 输出显示的块数大于文件大小

  • 772

据我所知,带有“-s”选项的 ls 命令以块为单位打印文件大小,ls 使用 1024 作为块大小,但我注意到一些奇怪的东西。

为了更好地理解,请考虑 ls -ls 命令的以下输出:

12 -rw-r--r--。1 根 10240 Jul 15 19:22 z

文件大小为 10240 字节,块大小为 1024,因此该文件的块数为 10240/1024 = 10 个块,但为什么ls显示 12 个块?

问候

ls block-device
  • 3 3 个回答
  • 437 Views

3 个回答

  • Voted
  1. Best Answer
    Gilles 'SO- stop being evil'
    2022-01-04T13:16:51+08:002022-01-04T13:16:51+08:00

    这里ls实际报告的是为文件分配的块的大小。该大小为 12 kB。

    这个大小传统上以 512 B 的“块”报告,因为在古代 Unix 系统上,它确实是许多 512 字节的块。但是块大小取决于文件系统,而ls无论如何都使用相同的单位。GNU 工具使用 1 kB 而不是 512 B 作为单位,因为千字节对人类来说比半千字节更有意义。

    Ext4 和其他几个常见的文件系统默认为 4 kB 块。所以一个 10240 字节的文件占用 3 个块,这 3 个块的大小是 12 kB。

    另请参阅文件块大小 - stat 和 ls之间的差异和块大小和集群大小之间的差异。

    • 4
  2. Seamus
    2022-01-05T02:07:35+08:002022-01-05T02:07:35+08:00

    这是一个很好的问题:在阅读了Gilles 的回答后,我不得不仔细man ls阅读,因为我很确定他的回答是错误的。相反,我提供这个答案来证明他是正确的!:Pls --help

    您ls -ls对 1024 字节文件的结果是:

    12 -rw-r--r--. 1 root root 10240 Jul 15 19:22 z
    

    如果我们相信man ls,并且您断言有问题的文件是 10,240 字节,那么这个结果告诉我们文件的大小是12 blocks,但这个结果并没有告诉我们这些块的大小。如果我们参考相关文章man ls来了解块大小,我们或多或少都是空手而归。

    相关段落man ls似乎如下:

    --block-size=SIZE
           with -l, scale sizes by SIZE when printing them; e.g., '--block size=M'; see SIZE format below
    
    -k, --kibibytes
            default to 1024-byte blocks for disk usage; used only with -s and per directory totals  
    
    -s, --size
           print the allocated size of each file, in blocks  
    
    The SIZE argument is an integer and optional unit (example: 10K is 10*1024).  Units are K,M,G,T,P,E,Z,Y (powers of 1024) or KB,MB,... (powers of 1000).
    
    什么都不相信:

    创建一个 10,240 字节的文件,如下所示:

    fallocate -l 10240 lstest.txt
    

    核实:

    wc -c lstest.txt
    10240 lstest.txt
    ls -l
      12 -rw-r--r-- 1 pi pi   10240 Jan  4 12:09 lstest.txt  
    ls -ls
      12 -rw-r--r-- 1 pi pi   10240 Jan  4 12:09 lstest.txt 
    ls -lks 
      12 -rw-r--r-- 1 pi pi   10240 Jan  4 02:09 lstest.txt 
    ls -ls --kibibytes 
      12 -rw-r--r-- 1 pi pi   10240 Jan  4 02:09 lstest.txt
    

    正如您所说,这似乎很奇怪,因为从表面上看文档,12 * 1,024 = 12,288 字节 - 大于 10,240 字节。

    但有一条出路:

    考虑三件事:

    1. 该-s选项报告allocation不是文件大小(参考man ls)
    2. 块大小是在文件系统中定义的抽象。它不是一个物理量,但将块大小与4,096 字节的高级格式扇区大小对齐是有效的。自 2011 年 1 月以来生产的所有 HDD 均符合高级格式化标准。
    3. 我们可以确定文件系统的块大小:
    stat -fc %s .     
    # or, if you prefer:
    stat -fc %s lstest.txt
    # which is, in both cases (on my ext3 filesystem):
    4096
    

    终于有答案了

    1.综上所述:ls不知道文件系统使用的块大小。
    2. 如果我们知道块大小,我们必须分享它ls以获得正确答案:
    ls -ls --block-size=4K 
    3 -rw-r--r-- 1 pi pi    3 Jan  4 02:09 lstest.txt
    

    请注意,3 * 4,096 = 12,288 字节。另请注意,块大小(4,096 字节)是块设备的一种存储量;即存储分配可以改变的最小量。现在很明显,12,288 字节实际上是所需的字节分配。但是,要获得块中的正确答案man ls,ls必须通过--block-size=4K选项告知系统的块大小。

    3. Gilles 的回答是正确的
    沉思:

    在我看来,这man ls并不像它可能的那样清楚。也许应该修改为它不知道文件系统块大小?

    更好的是,也许ls可以修改以从系统中获取块大小?毕竟——stat也是一部分GNU coreutils 8.30。

    • 2
  3. MC68020
    2022-01-04T13:17:27+08:002022-01-04T13:17:27+08:00

    因为它已成为默认值,所以底层文件系统很可能具有 4k 块大小。因此,您的 10.240 字节文件将需要 3 个 (ceil(10.240/4096)) 文件系统块。3 个 4k 块,每个被报告为 3 * 4 = 12 1k 块

    • 1

相关问题

  • 检查 Ubuntu 中的磁盘空间(使用 ls)

  • zsh:“ls -S”在实用程序文件夹中不起作用

  • 使用“ls”时如何将文件日期转换为特定格式

  • 管道 ls 是否与 ls -1 相同?

  • 如何使用 ls 的输出打开最后修改的文件?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve