概要
ファイルの内容を読み書きすることなく、指定したバイトサイズに「切り詰め(縮小)」たり「拡張(拡大)」したりするコマンドです。
ディスクの消費を抑えた巨大なテスト用ファイルの作成(スパースファイル)や、ログファイルの内容を一瞬で0バイトにしてリセットする場合などに使用されます。処理が一瞬で完了するのが特徴です。
仕様(引数・オプション)
構文
truncate [オプション] ファイル名...
主な引数・オプション
| オプション | 説明 |
-s <サイズ> | ファイルサイズを指定します(必須)。単位(K, M, G等)が使えます。 |
-c | ファイルが存在しない場合、新規作成しません(no-create)。 |
-r <参照ファイル> | 指定したファイルと同じサイズに設定します(reference)。 |
サイズ指定の単位
| 単位 | 意味 | バイト数 |
K / M / G | 1024ベース (KiB, MiB, GiB) | 1M = 1,048,576 bytes |
KB / MB / GB | 1000ベース (KB, MB, GB) | 1MB = 1,000,000 bytes |
基本の使い方
サイズを指定して、新しいファイルを作成します。すでに存在するファイルを指定した場合、そのサイズに変更されます。
コマンド
# 10MBのファイルを作成
truncate -s 10M dummy.dat
実行結果
ls -l で確認すると、指定したサイズになっています。
-rw-r--r-- 1 user user 10485760 Jan 20 12:00 dummy.dat
実践コマンド
単位によるサイズの違いを確認する
Linuxのコマンド(coreutils)では、MB と M で基準が異なります。正確なサイズが必要な場合は注意が必要です。
# 1000進数の1MB (1,000,000バイト)
truncate -s 1MB file_1000.txt
# 1024進数の1MiB (1,048,576バイト)
truncate -s 1M file_1024.txt
# サイズ比較
ls -l file_1*
-rw-r--r-- 1 user user 1048576 Jan 20 12:01 file_1024.txt
-rw-r--r-- 1 user user 1000000 Jan 20 12:01 file_1000.txt
既存のファイルを切り詰める(縮小)
指定したサイズよりファイルが大きい場合、末尾が削除(切り捨て)されます。
# 元のファイル内容とサイズを確認 (14バイト)
echo "This is test." > test.txt
ls -l test.txt
# 10バイトに切り詰める
truncate -s 10 test.txt
# 結果確認 (末尾の "est." と改行が消える)
ls -l test.txt
cat test.txt
-rw-r--r-- 1 user user 14 ... test.txt
-rw-r--r-- 1 user user 10 ... test.txt
This is t
既存のファイルを拡張する(相対指定)
現在のサイズから「+」や「-」を使って相対的にサイズを変更できます。拡張した場合、増えた部分はヌル文字(\0)で埋められます。
# 現在のサイズに 1GB 追加する
truncate -s +1G database.db
# 現在のサイズから 500KB 減らす
truncate -s -500K logfile.log
カスタムポイント
- スパースファイル(穴あきファイル):
truncateで巨大なサイズ(例: 1TB)に拡張しても、実際にディスク容量を消費するわけではありません(ヌル文字の部分はディスク上に確保されない)。これをスパースファイルと呼びます。- 確認方法:
ls -l(見かけのサイズ) とdu -h(実ディスク使用量) を比較すると違いがわかります。
- 確認方法:
- 一括処理:
truncate -s 0 *.logのようにワイルドカードを使って、ディレクトリ内の全ログを空にすることができます。
注意点
- データの消失:サイズを縮小(切り詰め)した場合、指定サイズ以降のデータは完全に消滅し、復元できません。
- 拡張時の内容は空:拡張した場合、データが増えるわけではなく、単にファイルの「終わりの位置」が後ろにずれるだけです。増えた部分は空データ(Null)として扱われます。
- オプション -s の必須性:-r (参照) を使わない限り、-s でサイズを指定しないとエラーになります。
応用
ログファイルを権限やinodeを維持したまま空にする
rm でログを削除して touch で作り直すと、ファイルの所有権やパーミッションが変わったり、ログ収集プロセスがファイルを見失ったりすることがあります。truncate を使えば、ファイルそのものは残したまま中身だけを消去できます。
# 稼働中のサーバーログを安全にリセットする
sudo truncate -s 0 /var/log/nginx/access.log
まとめ
truncateコマンドは、テストデータの作成やログ管理において、ファイルの中身を操作せずに「サイズ(枠)」だけを制御できる便利なツールです。「1GBのファイル転送テストをしたい」といった場合に、dd コマンドでゼロ埋めファイルを作るよりも一瞬で完了するため非常に効率的です。ただし、縮小操作は破壊的変更であることを理解し、単位(KB vs K)の違いに注意して使用してください。
