truncate 是什么
truncate 把文件调整到指定大小,主要服务于两个场景:清空正在被写入的日志,以及制造稀疏文件。它最容易被忽略的价值是:把大小设为 0 时不会更换文件的 inode,已经打开该文件的进程句柄继续有效——正在写日志的服务不受影响,空间也立即释放。相比之下删除文件会让写入进程继续占用空间直到句柄关闭。要注意缩小文件是直接把尾部数据砍掉,不可恢复。
基本信息
| 适用平台 | GNU/Linux、macOS(coreutils) |
|---|---|
| 语法 | truncate -s 大小 文件 |
| 大小写法 | 0 清空、加号前缀增大、减号前缀缩小、数值直接精确指定 |
| 单位后缀 | 支持 K、M、G,不写单位按字节 |
| 相关工具 | fallocate 用于真实预分配磁盘空间 |
| 风险 | 缩小操作不可逆 |
典型使用场景
- 紧急释放被日志写满的磁盘空间,同时不影响正在写日志的进程。
- 制造指定大小的稀疏文件用于测试或占位。
- 调整镜像或数据文件大小做边界测试。
- 清空服务的日志文件而不打断服务。
- 验证程序对超大文件的行为。
常用写法
常用写法
truncate -s 0 /var/log/app.log # 清空且保留 inode,写入进程不受影响
truncate -s 1G sparse.img # 造一个 1G 的稀疏文件
ls -lh sparse.img; du -h sparse.img # 比较逻辑大小与实际占用
truncate -s +100M data.bin # 追加 100M(稀疏,不真实占盘)
truncate -s -50M data.bin # 砍掉尾部 50M,不可恢复
: > /var/log/app.log # 等价的重定向清空写法
ls -l /var/log/app.log # 确认 inode 与大小写法与效果对照
| 写法 | 效果 | 使用要点 |
|---|---|---|
| -s 0 | 清空文件 | 保留 inode,写入进程不受影响 |
| -s 1G | 精确设置为 1G | 小于原大小时会砍掉尾部数据 |
| -s +100M | 增大文件 | 增加的部分是稀疏的,读出来是全零 |
| -s -50M | 缩小文件 | 直接砍掉尾部,不可恢复 |
| 单位后缀 | 指定大小单位 | 不写单位时按字节计算 |
| du 与 ls | 实际与逻辑大小 | 稀疏文件的差异从这里体现 |
清空正在被写入的日志优先用截断或重定向:比删除文件安全,因为打开该文件的进程句柄继续有效,空间立即释放,服务也不需要重启。
增大出来的部分是稀疏的:读出来全是零,但不真实占用磁盘;需要真实占盘要用预分配工具或直接写入数据。
缩小操作会砍掉尾部数据且无法恢复,执行前必须确认后半段内容没有人需要,必要时先备份。