Linux系统下移除稀疏文件空洞的方法及原地操作方案咨询
Linux系统下移除稀疏文件空洞的方法及原地操作方案咨询
你说得没错,cp --sparse=never <file> <file>.cp; rm <file>; mv <file>.cp <file>确实能搞定移除稀疏文件空洞的需求,但这个方案的硬伤是得有足够的空闲磁盘空间来存副本,碰到超大文件的时候就很尴尬。那Linux有没有像Windows里fsutil sparse setflag <file> 0那样原地修改、不需要额外空间的办法?当然有,下面给你分享两种实用方案:
优先推荐:用fallocate命令高效填充空洞
fallocate是Linux文件系统工具里专门用来管理文件空间的利器,它能直接让文件系统为文件的全部已声明大小分配实际磁盘块,全程不需要读写文件内容,速度快到飞起。具体命令如下:
fallocate -l $(stat -c %s <你的文件名>) <你的文件名>
简单解释下:
stat -c %s <文件名>是用来获取文件的总字节数的,确保我们要分配的长度和文件实际大小一致-l参数指定要分配的空间长度,用文件的总大小就能覆盖整个文件范围,让系统自动把所有空洞都填上实际的磁盘块。
备选方案:用dd命令填充(适合无fallocate的环境)
如果你的系统比较老旧,没有fallocate工具,也可以用dd来实现。原理是把文件完整读一遍(读取空洞的时候系统会自动填充0),再写回原文件,同时保持文件大小不变:
dd if=<你的文件名> of=<你的文件名> conv=notrunc
⚠️ 注意:这个方法会实际读写整个文件的内容,大文件的话速度会比fallocate慢很多,而且对I/O资源的占用也更高,所以优先用第一种方法。
最后提醒一句:操作前最好先备份文件,避免意外导致数据丢失哦!
备注:内容来源于stack exchange,提问作者hanshenrik




