Linux / コマンド / truncate - ファイルサイズの縮小と拡大

truncateは、ファイルの論理的なサイズを指定した値に縮小または拡張するコマンドです。ファイルを縮小すると切り取られたデータは失われ、拡張すると追加部分は通常0として読み取られるスパース領域になります。

この記事では、絶対・相対サイズ指定、単位、基準ファイルとのサイズ合わせ、スパースファイルと実際のディスク使用量の差、安全に結果を確認する方法について説明します。

truncateコマンドとは?

truncateは、ファイルの内容を書き直さずにファイルの末尾位置を変更します。存在しないファイルは基本的に新規作成され、-cを使用すると作成されません。サイズを縮小する作業は元に戻せない編集なので、重要なファイルは事前にバックアップしてください。

基本的な文法

サイズを指定する -s または基準ファイルを指定する -r が必要です。以下はGNU版の例で、既存の重要なデータではなく、新しく作った練習用ファイルで確認してください。

truncate [オプション] ファイル ...

ファイル名やパスに空白がある場合は引用符で囲み、ハイフンで始まる名前は可能であれば--の後に指定します。サポートされるオプションはディストリビューションとGNU Coreutilsのバージョンによって異なる場合があるため、truncate --helpとman truncateで現在のシステムの説明を確認してください。

truncateの基本的な使い方

ファイルを0バイトにする

ファイルは残したまま内容の長さだけ0にします。稼働中のサービスのログを任意に空にすると、ファイルオフセットやログ管理ポリシーに問題が発生する可能性があるため、まず専用のログローテーションツールを検討してください。

truncate -s 0 application.log

指定したサイズのファイルを作成する

-sにサイズと単位を指定します。ファイルがなければ新しく作成されます。

truncate -s 100M test.img
truncate -s 1GiB sparse.img

既存のサイズから増減する

サイズの前の+は増やし、-は減らします。シェルオプションと誤解されないように値は-sの引数として正確に渡します。

truncate -s +10M data.bin
truncate -s -512K data.bin

内容を空にした後でサイズを確認する

truncateは成功しても通常メッセージはありません。既存のファイルに-s 0を適用するとバイトサイズは0になります。

printf 'abc' > demo.txt
truncate -s 0 demo.txt
stat -c '%s %n' demo.txt

例の出力は0 demo.txtです。ファイル内容は復元されないため、実際のログやデータファイルで使用する前にバックアップと対象パスを確認してください。

主なオプション

オプション 説明
-s SIZE, --size=SIZE ファイルサイズを指定するか、接頭記号に従って調整します。
-c, --no-create 存在しないファイルを新しく作成しません。
-r FILE, --reference=FILE 基準ファイルのサイズを使用します。
-o, --io-blocks サイズをバイトではなく、ファイルのI/O(入出力)ブロック単位で解釈します。

長いオプションは意味を把握しやすく、スクリプトの確認にも役立ちます。ただし、移植性が重要なスクリプトでは対象システムがその GNU 拡張オプションをサポートしているかをまず確認してください。

実践的活用例

基準ファイルと同じサイズに合わせる

-r は基準ファイルの現在のサイズを対象に適用します。内容がコピーされるのではなく、サイズだけが合わせられます。reference.img は実在する基準ファイルに置き換え、縮小される側の内容が不要なことを先に確認してください。

truncate -r reference.img target.img
stat -c '%s %n' reference.img target.img

最小・最大サイズを制限する

GNU truncate のサイズプレフィックスは現在のサイズに条件を適用できます。< は指定サイズより大きい場合に減らし、> は小さい場合に増やします。

truncate -s '<100M' cache.bin
truncate -s '>1M' placeholder.bin

論理サイズとディスク使用量を比較する

増加した領域はブロックが実際に割り当てられていないスパース領域である可能性があります。stat と du を一緒に使用して、論理サイズと割り当て量を区別してください。スパース領域は、論理的には存在してもデータ用ブロックが割り当てられていない部分です。以下の stat の %b は512バイト単位の割り当てブロック数であり、そのままバイト数として比べないでください。duによる実際の使用量の確認も役立ちます。

truncate -s 1G sparse.img
stat -c 'size=%s blocks=%b' sparse.img
du -h sparse.img

truncateと関連コマンドの比較

コマンド・方法 主な役割 適した状況
truncate ファイルの終端位置と論理サイズの変更 高速にサイズを調整したりスパースファイルを作成する際
touch 空のファイル作成またはタイムスタンプ変更 既存の内容とサイズを維持する場合
dd 実際のデータブロックの書き込み・コピー 内容を埋めたりデバイスデータを複製する際
ログローテーションツール ログの保存・圧縮・再開管理 運用サービスのログを整理する際

使用する際の注意点

サイズを縮小するとデータが失われます

切り取られたファイルの末尾は通常のコマンドでは戻せません。重要なファイルはコピーを作成してから作業してください。

ファイルを大きくしても有効なフォーマットにはなりません

イメージやファイルシステムファイルのサイズを大きくしても内部構造が自動的に拡張されるわけではありません。そのフォーマット専用のツールが必要です。

スパースファイルのコピー方法を確認する

コピー用ツールや対象のファイルシステムがスパース領域を保持しない場合、実際のディスク使用量が大幅に増える可能性があります。

FAQ

truncate -s 0はファイルを削除しますか?

いいえ。ファイルの名前は残り、内容の長さが0バイトになります。更新時刻などのメタデータは変わり得るため、すべての属性が保持されるとは考えないでください。ストレージ上のデータを安全に消去する操作でもありません。

ファイルを大きくすると、その分ディスクスペースはすぐに使用されますか?

増えた領域がスパース領域として作られると、論理サイズよりも実際の割り当て量は少なくなることがあります。duとstatで確認してください。

存在しないファイルを作らないようにするにはどうすればよいですか?

truncate -c -s サイズ ファイル を使用します。

基準ファイルの内容もコピーされますか?

いいえ。-rは基準ファイルのサイズのみ使用し、内容はコピーしません。

参考資料