首页/系统/Linux 运维命令速查/truncate 截断或扩展文件
文件与目录76 条

truncate 截断或扩展文件

把文件改到指定大小:-s 0 清空日志(不换 inode)、+N 稀疏扩展、-N 缩小;造稀疏测试文件也常用。

Linux 运维命令速查系统更新于 2026-10-13

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实际与逻辑大小稀疏文件的差异从这里体现
清空正在被写入的日志优先用截断或重定向:比删除文件安全,因为打开该文件的进程句柄继续有效,空间立即释放,服务也不需要重启。
增大出来的部分是稀疏的:读出来全是零,但不真实占用磁盘;需要真实占盘要用预分配工具或直接写入数据。
缩小操作会砍掉尾部数据且无法恢复,执行前必须确认后半段内容没有人需要,必要时先备份。

易错点

  • 用删除文件的方式清理被占用的日志,进程句柄仍指向已删除文件,空间不会释放,磁盘继续报警。
  • 把缩小操作当成分割工具:尾部数据被永久删除,没有备份就无法恢复。
  • 误以为增大文件会真实占用磁盘,用稀疏文件做容量预留,实际空间并没有被占用。
  • 对正在写入的文件做截断后又期望历史日志仍在,日志已被清零,排障线索丢失。

数据来源与参考

  • man 1 truncate(GNU coreutils 手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌