名称

truncate - 缩小或扩展文件到指定大小

简介

truncate [选项]... 文件...

描述

truncate 命令将每个文件的大小调整为指定的大小。如果文件不存在,通常会创建新的空文件(除非指定了 -c 选项)。该命令主要用于:

  • 快速创建指定大小的文件(如创建空白磁盘映像、测试文件)。

  • 截断文件(删除文件末尾部分)或将文件扩展(填充空字节)。

  • 在不打开文件的情况下调整文件大小。

扩展文件时,新增部分在磁盘上通常以空洞(sparse)方式存在,实际不占用物理空间,直到写入数据。缩小文件时,超出新大小的数据会永久丢失。

选项

短选项

长选项

描述

-c

--no-create

不创建文件:如果文件不存在,直接忽略且不报错。

-o

--io-blocks

--size 指定的数字解释为 I/O 块数(块大小通常为 512 字节),而不是字节。

-r

--reference=参考文件

将目标文件的大小设置为与参考文件相同。

-s

--size=大小

设置文件大小为指定值。大小可以是绝对值或相对值(见下文“大小格式”)。

--help

显示帮助信息并退出。

--version

显示版本信息并退出。

大小格式

--size 参数可以指定数值及可选单位,也可以使用相对调整符号。基本格式为:

[+|-|/|%]数值[单位]
  • 数值:整数(可正可负,但配合符号使用时符号在前)。

  • 单位

    • KMGTPEZY:以 1024 为基数(如 1K = 1024 字节)。

    • KBMBGBTBPBEBZBYB:以 1000 为基数(如 1KB = 1000 字节)。

    • 若不指定单位,则默认为字节。

  • 相对符号(放在数值前):

    • +:增加大小(相对于当前文件大小)。

    • -:减少大小。

    • <:如果当前大小小于指定值,则保持不变;否则截断到指定值(即不大于)。

    • >:如果当前大小大于指定值,则保持不变;否则扩展到指定值(即不小于)。

    • /:向下舍入到指定值的倍数(通常结合块大小使用)。

    • %:向上舍入到指定值的倍数。

示例:+10M 表示在当前大小基础上增加 10 MiB;-2G 表示减少 2 GiB;<1G 确保文件不超过 1 GiB。

退出状态

  • 0 – 所有操作成功完成。

  • >0 – 发生错误(如文件无法访问、无效大小格式、权限不足等)。

常用示例

1. 将文件大小设置为 100 MiB

truncate -s 100M file.txt

如果文件不存在则创建;若存在则调整为恰好 100 MiB(扩展时空字节填充,缩小则截断末尾)。

2. 将文件扩展到 200 MiB(不缩小)

truncate -s >200M file.txt

使用 > 确保只扩展不缩小,即若当前小于 200 MiB 则扩展到 200 MiB,否则保持原样。

3. 将文件缩小到 50 MiB

truncate -s 50M file.txt

4. 在当前大小基础上增加 10 MiB

truncate -s +10M file.txt

5. 在当前大小基础上减少 20 MiB

truncate -s -20M file.txt

6. 不创建新文件(文件不存在则忽略)

truncate -c -s 100M maybe_not_exist.txt

7. 参考另一个文件的大小

truncate -r reference.txt target.txt

target.txt 的大小调整为与 reference.txt 相同。

8. 清空文件(大小设为 0)

truncate -s 0 file.txt

快速清空文件内容,类似于 > file.txt 但更明确。

9. 创建指定大小的空文件(用于测试)

truncate -s 1G largefile.bin

创建一个 1 GiB 的空文件(实际为稀疏文件,不占 1 GiB 物理空间)。

10. 使用块大小(假设块大小为 512 字节)

truncate -o -s 2048 file.txt

将文件大小设置为 2048 个 I/O 块,即 2048 × 512 = 1,048,576 字节。

11. 确保文件不超过 500 MiB(若超过则截断)

truncate -s <500M file.txt

12. 将文件大小调整为下一个 1 MiB 的整数倍(向上取整)

truncate -s %1M file.txt

若当前大小为 2.3 MiB,则调整为 3 MiB。

注意事项

  • 数据丢失风险:缩小文件会丢失超出新大小的数据,操作前建议备份。

  • 稀疏文件:扩展出的空间在磁盘上不实际占用,直到写入数据。但某些文件系统或挂载选项可能不支持空洞。

  • 相对大小:使用 +- 时,如果文件不存在,会报错(除非同时使用 -c 忽略不存在文件)。

  • 权限要求:需要拥有文件的写权限,以及目录的执行权限(用于创建新文件)。

  • 符号链接truncate 操作的是符号链接指向的目标文件,而不是链接本身。如果要调整链接自身大小,通常无意义(链接本身很小)。

  • dd 的区别dd 可以通过复制零来创建固定大小的文件,但会实际写入零,性能较差且占用物理空间;truncate 创建空洞文件更快,更节省空间。

  • fallocate 的区别fallocate 用于预分配物理空间,支持保留空间但不实际写入数据(类似于 truncate 但更强大)。truncate 专注于调整文件大小,可以缩小和创建空洞,但不会预分配物理块。

相关命令

  • dd – 转换和复制文件,可创建固定大小的文件(实际写入数据)。

  • fallocate – 预分配或释放文件空间,支持保留物理空间、打洞等操作。

  • head / tail – 提取文件开头或结尾的部分内容。

  • rm – 删除文件。

  • touch – 更改文件时间戳或创建空文件。

  • ls -l – 查看文件大小。

  • stat – 显示文件详细状态(包括大小、块数等)。