如何缩减表观大小超大但实际磁盘占用极小的文件?
如何缩减表观大小超大但实际磁盘占用极小的文件?
嘿,这个问题挺有意思的——你碰到的是反向稀疏文件的情况:文件开头有一个大得离谱的空洞,实际数据却存在于非常靠后的位置,所以ls显示的表观大小是「空洞尺寸+实际数据尺寸」,但磁盘上只存了那一小部分实际数据。
先给你直接上解决方案,再解释为啥之前的方法没用:
单个文件处理方法
你已经通过hdparm --fibmap拿到了数据块的起始偏移量:94331430207488,我们可以用dd命令只复制实际存在的数据部分,把空洞直接丢掉:
# 计算要跳过的块数(dd默认块大小是512字节) SKIP=$((94331430207488 / 512)) # 复制实际数据到新文件 dd if=你的原文件名 of=新文件名 skip=$SKIP bs=512
复制完成后,你用ls -lh 新文件名看表观大小,再用du -sh 新文件名看磁盘占用,应该就一致了。确认没问题后,就可以把新文件替换原文件(记得先备份原文件,以防意外)。
批量处理脚本(如果所有文件都是同样偏移)
如果解压出来的所有文件都是这个情况,写个简单的shell脚本批量处理更高效:
# 设定已知的偏移量和块大小 OFFSET=94331430207488 BLOCK_SIZE=512 SKIP=$((OFFSET / BLOCK_SIZE)) # 遍历当前目录下的所有文件 for file in *; do # 只处理普通文件 if [ -f "$file" ]; then echo "正在处理 $file..." dd if="$file" of="new_$file" skip=$SKIP bs=$BLOCK_SIZE # 这里先不要急着替换,先验证几个新文件没问题后,再把下面的注释去掉 # mv "new_$file" "$file" fi done
为啥之前的方法没效果?
fallocate -d:这个命令是用来释放稀疏文件里空洞的磁盘空间,但它不会移动数据的位置——你的空洞在开头,数据在后面,所以它没法改变文件的表观大小。cp --sparse=never:这个参数是强制禁止创建稀疏文件,会把空洞部分全部写入0,反而会让磁盘占用飙升到8.6P,完全反效果。filefrag显示单个extent:这很正常,因为你的实际数据确实是一块连续的,只是这块数据的起始位置太靠后了而已。
备注:内容来源于stack exchange,提问作者Nassiel
相关产品推荐
相关产品推荐

