为什么linux下空目录大小也是4kb?

2023-10-24 20:59
文章标签 linux 大小 空目录 4kb

本文主要是介绍为什么linux下空目录大小也是4kb?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

    前几天同学问我:我用ls -l看目录大小。怎么都是4kb?

如图

    test目录下面有个空目录tt,tt的实际大小为4096。如果我在tt下面创建几个新的文件,tt的大小结果还是4096。也就是说,目录的大小的概念他不是很清楚。

    本人之前也未仔细想过这个问题。翻阅《深入理解linux内核》也未得到答案。于是寻思半天,给出一个答案,不知是否正确,还请有了解的赐教了。

    文件的大小大家都知道,比如一个文件1kb,由于簇的关系,实际占用4kb(假设)。如果我要读取这个文件的全部内容,我是alloc 1kb还是 4kb的内存呢?想必大家都是清楚的,应该是1kb。

    目录在linux下也是相当于一个文件,为了读取目录里面的目录项,我就必须读取它的全部内容。而这个大小就是盘块大小(或者几个盘块大小,视目录项个数决定)。由于目录项并不是连续排列的,比如tt目录里原先有500个文件,删了499个文件,剩下的1个目录项在哪里?是的,可能在一开始,也可能在最后。为了得到里面的那个目录项,我只能把盘块全部读取出来。在没有读取盘块之前,你是没有办法知道里面的目录项的!

    由于目录的特殊性,目录的实际大小就是占用空间的大小(上图就是4096)。这样子,可以使得读取目录和读取文件一样,可以统一起来了。

    话说的有点啰嗦了,不知道有过同样疑问的各位是否能够看懂,如果你有自己的想法,也欢迎讨论~~~


补充:

    这是资料截图。inode 指i_node节点编号,rec_len指离下个目录项的偏移,后面的看看也知道的吧。由于name不丁长,所以需要name_lens。所以一个目录项至少12字节。一个目录块4096字节,可以放多少目录项呢。答案是2+339 =341 。2指 . 和 .. 两个目录项 , 339 为自己创建的文件的目录项。通过测试也证明了我的猜测。你如果创建340个文件,那目录块就会立马变大到12kb。(为什么不是8kb,有谁知道?)。

下面的原文如是说:

The directory entries must be aligned on 4 bytes boundaries and there cannot be any directory entry spanning multiple data blocks. If an entry cannot completely fit in one block, it must be pushed to the next data block and the rec_len of the previous entry properly adjusted.(一个放不下,就放到下一个去,前面的目录项的rec_len字段做相应调整)

    事实上,你删除目录里的文件把目录项删除后,空余的盘块是不会回收的。也就是说,目录的大小只增不减。

原文如下:

A directory is a filesystem object and has an inode just like a file. It is a specially formatted file containing records which associate each name with an inode number. Later revisions of the filesystem also encode the type of the object (file, directory, symlink, device, fifo, socket) to avoid the need to check the inode itself for this information.

The inode allocation code should try to assign inodes which are in the same block group as the directory in which they are first created.

The original Ext2 revision used singly-linked list to store the filenames in the directory; newer revisions are able to use hashes and binary trees.
Also note that as directory grows additional blocks are assigned to store the additional file records. When filenames are removed, some implementations do not free these additional blocks.(记住:如果目录项很多,就会有多个额外的盘块来保存,但当里面的文件删除后,某些实现并不删除这些多余的盘块)

各位可以在自己的pc上试试。欢迎讨论.

转载于:https://my.oschina.net/u/225495/blog/122578

这篇关于为什么linux下空目录大小也是4kb?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/277718

相关文章

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Linux中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

在Linux终端中统计非二进制文件行数的实现方法

《在Linux终端中统计非二进制文件行数的实现方法》在Linux系统中,有时需要统计非二进制文件(如CSV、TXT文件)的行数,而不希望手动打开文件进行查看,例如,在处理大型日志文件、数据文件时,了解... 目录在linux终端中统计非二进制文件的行数技术背景实现步骤1. 使用wc命令2. 使用grep命令

Linux如何快速检查服务器的硬件配置和性能指标

《Linux如何快速检查服务器的硬件配置和性能指标》在运维和开发工作中,我们经常需要快速检查Linux服务器的硬件配置和性能指标,本文将以CentOS为例,介绍如何通过命令行快速获取这些关键信息,... 目录引言一、查询CPU核心数编程(几C?)1. 使用 nproc(最简单)2. 使用 lscpu(详细信

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文

基于Linux的ffmpeg python的关键帧抽取

《基于Linux的ffmpegpython的关键帧抽取》本文主要介绍了基于Linux的ffmpegpython的关键帧抽取,实现以按帧或时间间隔抽取关键帧,文中通过示例代码介绍的非常详细,对大家的学... 目录1.FFmpeg的环境配置1) 创建一个虚拟环境envjavascript2) ffmpeg-py

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

详解Linux中常见环境变量的特点与设置

《详解Linux中常见环境变量的特点与设置》环境变量是操作系统和用户设置的一些动态键值对,为运行的程序提供配置信息,理解环境变量对于系统管理、软件开发都很重要,下面小编就为大家详细介绍一下吧... 目录前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断