xxdコマンドにファイル変更機能はあるか

xxdコマンドが既存ファイルを更新する条件

xxdコマンドをエージェントAIに実行させる際、どのような呼び出し方であれば既存ファイルへの 変更が発生するのかを、xxd本体のソースコードに基づいて整理する。

1. 判断基準の結論

既存ファイルが更新されるかどうかを分けるのは-rオプションの有無ではない。 本質的な条件は次の2点である。

  • コマンドラインにoutfile(第2引数)が指定されているか
  • そのoutfileが既存のファイルパスを指しているか

この2条件が満たされる場合、-rの有無に関わらず既存ファイルは変更される。 -rが変えるのは「変更が起きるかどうか」ではなく「どのように変更されるか」である。

2. ソースコード上の根拠

vim本家のxxd.cにおける、outfileを開く処理の該当箇所は以下の通りである。

int mode = revert ? O_WRONLY : (O_TRUNC|O_WRONLY);

if (((fd = OPEN(argv[2], mode | BIN_CREAT(revert), 0666)) < 0) ||
    (fpo = fdopen(fd, BIN_WRITE(revert))) == NULL)

revert-r指定の有無を表すフラグである。ここでのモード指定が、 既存ファイルへの影響を決定づけている。

  • -rなしrevert=0): mode = O_TRUNC | O_WRONLYO_TRUNCが付与されるため、 outfileが既存ファイルであれば開いた瞬間に中身が消去され、新たなhexdumpテキストで 上書きされる。既存内容は完全に失われる。
  • -rありrevert=1): mode = O_WRONLYO_TRUNCなし)。truncateされないため、 hexdump内のアドレス情報に基づき、該当オフセットのバイトだけが上書きされる (部分パッチ)。

xxdの変更履歴にも、通常モードで既存outfileがtruncateされる仕様を裏付ける記述がある。

26.09.98 Fixed: 'xxd -i infile outfile' did not truncate outfile.

3. 条件別の整理

outfileの指定 -rの有無 既存ファイルへの影響
省略(標準出力) 問わない 影響なし
新規パス 問わない 影響なし(新規ファイル作成)
既存ファイル なし truncateにより全体上書き(既存内容は完全消失)
既存ファイル あり truncateされず、該当オフセットのみ部分的に上書き

4. 許可判断基準への適用

既存ファイルの更新有無を判定する一次条件は、「outfileが指定され、かつそれが既存ファイルを 指しているか」である。この条件に該当する場合は、-rの有無を問わず常に 「既存ファイルへの書き込みが発生するコマンド」として扱うべきである。

その上で-rの有無は、影響の性質を分類する二次的な指標として利用できる。

  • -rなし:全体破壊型(既存内容が丸ごと失われる)
  • -rあり:局所改ざん型(一部バイトのみ変わり、差分が小さく検知しづらい)

コメント

このブログの人気の投稿

WSL2 Ubuntu への Codex CLI 導入手順

macで node.js と npm をインストールする流れ