# Linux 文件删除原理

#### 博客作者：联系请[点击](https://hezhiqiang.gitbook.io/about-the-author/lian-xi-zuo-zhe)，搬运不易，希望请作者喝咖啡，可以点击[联系博客作者](https://hezhiqiang.gitbook.io/about-the-author/lian-xi-zuo-zhe)

Linux是通过link的数量来控制文件删除的，只有当一个文件不存在任何link的时候，这个文件才会被删除。一般来说，每个文件都有2个link计数器:i\_count 和 i\_nlink。&#x20;

i\_count的意义是当前文件使用者（或被调用）的数量,i\_nlink 的意义是介质连接的数量（硬链接的数量）；可以理解 为i\_count是内存引用计数器，i\_nlink是磁盘的引用计数器。&#x20;

当一个文件被某一个进程引用时，对应i\_count数就会增加；当创建文件的硬链接的时候，对应i\_nlink数就会增加。&#x20;

对于删除命令rm而言，实际就是减少磁盘引用计数i\_nlink。这里就会有一个问题，如果一个文件正在被某个进程调 用，而用户却执行rm操作把文件删除了，那么会出现什么结果呢？当用户执行rm操作删除文件后，再执行ls或者其 他文件管理命令，无法再找到这个文件了，但是调用这个删除的文件的进程却在继续正常执行，依然能够从文件中正 确的读取及写入内容。这又是为什么呢？&#x20;

这是因为rm操作只是将文件的i\_nlink减少了，如果没其它的链接i\_nlink就为0了；但由于该文件依然被进程引用，因 此，此时文件对应的i\_count并不为0，所以即使执行rm操作，但系统并没有真正删除这个文件，当只有i\_nlink及 i\_count都为0的时候，这个文件才会真正被删除。也就是说，还需要解除该进程的对该文件的调用才行。&#x20;

以上讲的i\_nlink及i\_count是文件删除的真实条件，但是当文件没有被调用时，执行了rm操作删除文件后是否还可以 找回被删的文件呢？&#x20;

前面说了，rm操作只是将文件的i\_nlink减少了，或者说置0了，实际就是将文件名到inode的链接删除了，此时，并 没有删除文件的实体即（block数据块），此时，如果及时停止机器工作，数据是可以找回的，如果此时继续写入数 据，那么当新数据就可能会被分配到被删除的数据的block数据块，此时，文件就会被真正的回收了，那时就是神仙 也没有办法了。
