質問: **CentOSで下記コマンドを実行しました。** ・置換実行されたファイルの更新日時が変更されるのは分かるのですが、置換実行されないファイルの更新日時も変更されたので驚きました ・どういう理屈でファイルの更新日時が変更されるのですか? ・find実行したから? sed実行したから?? ``` find /var/www/html -type f -exec sed -i 's/a\.php/b\.php/g' {} + ```
回答: 少し考えればすぐわかることだと思いますが...。 「置換実行されないファイル」と表現されていますが、正確ではありません。「置換を実行したものの結果的に該当箇所がなかった」に過ぎません。つまり、全てのファイルに対して置換を実行しているため、更新日時が変更されるのは当たり前です。 念のため、`sed`は`'s/a\.php/b\.php/g'`成否に関わらず行を読み込み書き出します。 期待する結果を得るためには`grep`などで置換するファイル・置換しないファイルを選別する必要があります。 > > 「grepで置換ファイルを選別する」処理を追記すると、条件分岐が増えるので、処理完了するまでの時間が遅くなる(可能性がある)と考えて良いですか? > > > IO速度次第です。置換しないファイルが多ければ早くなる可能性もあります。また、ファイル名に特殊な文字が含まれていないことが事前に分かっているのであれば、`find`でファイルを探す代わりに`grep -r -l`で置換するファイルだけを列挙できると思います。